我只有一张桌子 我需要返回行中所有4列被多次查看的行的所有列。
我有一个大表,其中的数据具有唯一的ID,可能会重复出现几列,然后在获得数据的那一年是2018年或2019年:
ID - Name - ZIP - Phone - Year Recorded
4234 | John | 56473 | 555-555-555 | 2018
4234 | Tod | 73746 | 556-556-556 | 2018
4235 | John | 56473 | 555-555-555 | 2019
4236 | Mary | 47384 | 577-577-577 | 2019
我想从[表格]中选择*,其中重复输入姓名,邮政编码,电话,年份为2019:
4235 | John | 56473 | 555-555-555 | 2019
我已经使用以下内容至少显示了与这些列相同的所有行中的几个列:
SELECT `Name`, `ZIP`, `Phone`, COUNT(*)
FROM VULNS
GROUP BY `Name`, `ZIP`, `Phone`
HAVING COUNT(*) > 1
John | 56473 | 555-555-555 | 2
问题是我需要包括ID和记录的年份,但是由于它们不在GROUP BY中,所以不能包括它们。如果我将那些列包括在GROUP BY中,那么一切都是唯一的,那么我将不会获得结果。
自从我大量使用SQL以来已经有很长时间了,我认为我用了错误的方法。
答案 0 :(得分:1)
我会使用exists
:
SELECT v.*
FROM VULNS as v
WHERE v.YearRecord = 2019 AND
EXISTS (SELECT 1
FROM VULNS as v2
WHERE v2.Name = v.Name AND
v2.ZIP = v.ZIP AND
v2.Phone = v.Phone AND
v2.YearRecorded <> v.YearRecorded
);
也就是说,只需返回2019
中另一年匹配的行即可。
答案 1 :(得分:0)
将ID
包含在GROUP BY
列表中,以进行子查询,并使用( Name, ZIP, Phone, YearRecorded)
与应考虑MAX(YearRecorded)
的子查询进行排序:
SELECT `ID`, `Name`, `ZIP`, `Phone`, `YearRecorded`
FROM VULNS
WHERE (`Name`, `ZIP`, `Phone`, `YearRecorded`) in
(
SELECT `Name`, `ZIP`, `Phone`, MAX(`YearRecorded`)
FROM VULNS v
GROUP BY `ID`, `Name`, `ZIP`, `Phone`
HAVING COUNT(*) > 1
)