【问题标题】:Mysql innjer join with one to many duplicate recordsMysql innjer 加入一对多重复记录
【发布时间】:2014-08-25 17:56:38
【问题描述】:

假设我在桌子下面

学生

id  Name
-------------------
1   john
2   carlos
3   zoya
4   arab
5   amir

和,

电子邮件

id      email   student_id
--------------------------
1   a@mail.com      1
2   b@mail.com      2
3   c@mail.com      2
4   d@mail.com      3
5   e@mail.com      4

并使用 sql 查询获取学生姓名和电子邮件,

SELECT student.name, email.eid FROM student 
INNER JOIN email 
ON student.id = email.student_id

它会给出以下输出,

Name        eid
-------------------
john    a@mail.com
carlos  b@mail.com
carlos  c@mail.com
zoya    d@mail.com
amir    e@mail.com

这里返回了carlos 的重复条目(实际上并非重复), 但我只想要像这样的单个学生列表,(b@gmail.comc@gmail.com 无关紧要)。

Name        eid
-------------------
john    a@mail.com
carlos  b@mail.com
zoya    d@mail.com
amir    e@mail.com

我对sql没有太多经验,

我用过DISTINCT,但它不起作用..请帮助

不:我将电子邮件存储在不同的表中,以备将来需要。

【问题讨论】:

  • 你可以使用GROUP BY name
  • 哪一个?为什么是 b 而不是 c
  • 这不是重复条目,用户 carlos 有两封不同的电子邮件。如果你不想要两个 carlos 用户,你可以 GROUP BY。
  • 感谢评论员建议GROUP By 特别是@MKhalidJunaid .. 结果完全符合预期。
  • @user3710243 - 如果您有不同的错误,您应该提出一个新问题,而不是修改您的旧问题,这会使已经给出的答案毫无用处。

标签: mysql sql database


【解决方案1】:

您遇到了问题,因为有些学生有多封电子邮件,而您只是在寻找一个。如果你不在乎哪一个,那就用MIN()MAX()

SELECT s.name, MIN(e.eid)
FROM student s INNER JOIN
     email e
     ON s.id = e.student_id
GROUP BY s.name;

如果你关心哪一个,那么你需要解释在多个中选择的逻辑。

【讨论】:

  • 缺少group by 吗?在 MySQL 中,我猜你甚至可以省略 min(),因为它会默认获取一个随机值
  • @Andomar 。 . .谢谢你。如果我省略了MIN(),MySQL 将从 indeterminate 匹配行返回一个值。这与 random 值不同。
【解决方案2】:

这应该可以工作

SELECT distinct student.name, email.eid FROM student 
INNER JOIN email 
ON student.id = email.student_id

为什么要将电子邮件存储在不同的表中然后加入它们,您可以将它们存储在学生表本身中,这使得设计更简单,查询更容易。

【讨论】:

  • 不同的不起作用...我将电子邮件存储在不同的表中以防将来需要..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
相关资源
最近更新 更多