我确实看过SO内外,但仍然不知道是否可以这样做。我有一张看起来像这样的表:
User ID | Role | First Name | Last Name | Email |<br>
0001 | K | John | Smith | e@e.co|<br>
0002 | Q | Jane | Dickens | q@q.co|<br>
0003 | K | John | Smith | e@e.co|<br>
0004 | J | Jack | Paper | j@j.co|<br>
如您所见,由于用户两次分别输入信息,该表包含重复内容。我想显示那些行
我可以获得使用内部连接子查询的前三个条件,但是当我尝试添加第四个条件时,我得到0个返回结果。
提前感谢您的帮助!
答案 0 :(得分:0)
SELECT GROUP_CONCAT(`User ID`) as IDs, Role, `First Name`, `Last Name`, Email
FROM users_table
GROUP BY Role,`First Name`,`Last Name`,Email
会给出像
这样的表格IDs | Role | First Name | Last Name | Email |
0001,0003 | K | John | Smith | e@e.co|
0002 | Q | Jane | Dickens | q@q.co|
0004 | J | Jack | Paper | j@j.co|
诀窍是GROUP BY
除ID
以外的所有内容。
你也可以这样做:
SELECT COUNT(`User ID`) as numIDs, GROUP_CONCAT(`User ID`) as IDs,
Role, `First Name`, `Last Name`, Email
FROM users_table
GROUP BY Role,`First Name`,`Last Name`,Email
HAVING numIDs > 1
获取
numIDs |IDs | Role | First Name | Last Name | Email |
2 |0001,0003 | K | John | Smith | e@e.co|
无论如何,你明白了如何根据你的目的改变它。
答案 1 :(得分:0)
尝试类似:
select *
from tb_users
where (first_name, last_name, email) in
(select first_name, last_name, email
from tb_users
group by first_name, last_name, email
having count(*) > 1)
答案 2 :(得分:0)
我假设您的表不包含真正重复的行(用户ID也匹配)。我认为应该像这样简单地获取相关的行(使用我的调整列和表命名方案):
SELECT ui.user_id, ui.role, ui.first_name, ui.last_name, ui.email
FROM user_info AS ui
INNER JOIN user_info AS udi
ON ui.first_name = udi.first_name
AND ui.last_name = udi.last_name
AND ui.email = udi.email
AND ui.user_id != udi.user_id;
答案 3 :(得分:0)
我会使用count(*)和group by子句。
喜欢这个
SELECT count(*)as count
FROM table group by concat(firstname,'\ n',last_name)count
= 1;
答案 4 :(得分:0)
我认为您要删除重复的行。只按分组计数并删除重复的行。
select * from tb_users
group by first_name, last_name, email
having count(*) > 1