如何获取在特定字段上共享值的表的所有行?

时间:2017-12-03 13:26:42

标签: mysql sql

例如

如果我有一个名为学生的表有4个字段id,fname,lname和dob(出生日期)如何检索所有分享生日的学生姓名(不要求特定的出生日期)以及他们分享的日期?

id int主键不为null且auto_increment为 fname lname 是varchar
dob 是日期

id    fname     lname       dob

1.    Nick      Tailor      1993-04-27
2.    Mary      White       1987-11-13
3.    Helen     Wilde       1993-04-27
4.    George    Bishop      1981-02-29
5.    John      Walker      1981-02-29
6.    Vincent   Valentine   1981-02-29

,结果是

fname     lname       dob

Nick      Tailor      1993-04-27
Helen     Wilde       1993-04-27
George    Bishop      1981-02-29
John      Walker      1981-02-29
Vincent   Valentine   1981-02-29

玛丽没有出现在任何地方,因为她不与表中的任何人分享dob。

6 个答案:

答案 0 :(得分:2)

我希望这会有所帮助

SELECT fname, lname, dob
FROM students
WHERE dob IN (SELECT dob FROM students GROUP BY dob HAVING count(*) > 1);

确保检查数据库配置中的dob列,当我在我的终端上运行查询以测试它是否有效时,我得到了一个日期错误,因为1981年2月29日没有:D

答案 1 :(得分:1)

您可以使用exists

select e.*
from exampledata ed
where exists (select 1
              from exampledata ed2
              where ed2.dob = ed.dob and ed2.id <> ed.id
             );

您只需执行以下操作即可检查是否存在重复:

select ed.dob, count(*), group_concat(ed.id)
from exampledata ed
group by ed.dob
having count(*) > 1;

答案 2 :(得分:1)

尝试以下

SELECT s1.* FROM `students`s1
INNER JOIN `students` s2 on  s1.`dob` = s2.`dob` and s1.`id`<> s2.`id`
GROUP BY s1.`id`

答案 3 :(得分:1)

这适用于Oracle,我相信它也适用于MySQL:

select *
  from xtb
 where xfl in (select xfl 
                 from xtb
                group by xfl
               having count(*) > 1)
 order by xfl 

答案 4 :(得分:1)

当您使用年份来提取这些重复数据时,我在这里使用了一个示例:

SELECT Temp.fname, Temp.lname, Temp.dob
FROM (
   SELECT m.fname, m.lname, m.dob, 
   COUNT(YEAR(dob)) AS CNT FROM TableName m 
   GROUP BY m.fname, m.lname, m.dob
) AS Temp ---- Sub query
WHERE Temp.CNT > 1 ---- Here check if there is any year greater than 1

答案 5 :(得分:1)

解决方案查询:

SELECT fname as 'First Name', lname as 'Last Name',dob as 'Birthday' FROM students WHERE dob IN(SELECT dob FROM students GROUP BY dob HAVING COUNT(id) > 1) ORDER BY dob;