例如
如果我有一个名为学生的表有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。
答案 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;