我的数据库包含通常如下所示的行:
PersonItem
__________
id
personId
itemId
╔════╦══════════╦════════╗
║ ID ║ PERSONID ║ ITEMID ║
╠════╬══════════╬════════╣
║ 1 ║ 123 ║ 456 ║
║ 2 ║ 123 ║ 456 ║
║ 3 ║ 123 ║ 555 ║
║ 4 ║ 444 ║ 456 ║
║ 5 ║ 123 ║ 456 ║
║ 6 ║ 333 ║ 555 ║
║ 7 ║ 444 ║ 456 ║
╚════╩══════════╩════════╝我需要找到PersonId和ItemId列与数据库中这两个列的其他记录相匹配的所有实际记录。
| 1 | 123 | 456
| 2 | 123 | 456
| 5 | 123 | 456
| 4 | 444 | 456
| 7 | 444 | 456我该如何着手获取这些结果呢?
发布于 2013-05-29 08:29:49
您可以使用连接来处理重复的记录。
SELECT a.*
FROM TableName a
INNER JOIN
(
SELECT PersonID, ItemID, COUNT(*) totalCount
FROM TableName
GROUP BY PersonID, ItemID
HAVING COUNT(*) > 1
) b ON a.PersonID = b.PersonID AND
a.ItemID = b.ItemID输出
╔════╦══════════╦════════╗
║ ID ║ PERSONID ║ ITEMID ║
╠════╬══════════╬════════╣
║ 1 ║ 123 ║ 456 ║
║ 2 ║ 123 ║ 456 ║
║ 5 ║ 123 ║ 456 ║
║ 4 ║ 444 ║ 456 ║
║ 7 ║ 444 ║ 456 ║
╚════╩══════════╩════════╝发布于 2013-05-29 08:31:28
下面这样的代码应该能起到作用:
SELECT P1.*
FROM PersonItem P1
INNER JOIN PersonItem P2 ON P2.ID <> P1.ID
AND P2.PersonId = P1.PersonId
AND P2.ItemId = P1.ItemId发布于 2013-05-29 08:28:59
您需要找到personid/itemid对出现多次的示例。在MySQL中,您可以使用where子句和子查询来执行此操作:
select t.*
from t
where exists (select 1
from t t2
group by personid, itemid
having count(*) > 1 and
t2.personid = t.personid and t2.itemid = t.itemid
)上面是标准的SQL语句。MySQL还支持多列in语句。所以这可以写成:
select t.*
from t
where (t.personid, t.itemid) in (select personid, itemid
from t
group by personid, itemid
having count(*) > 1
)我喜欢的另一种选择,基于尤金的答案,但更有效,是:
SELECT t.personid, t.ItemId, GROUP_CONCAT(t.ID)
FROM t
GROUP BY t.personid, t.ItemId
HAVING COUNT(*) > 1;如果您不介意以列表形式而不是单独的行形式获取ids,那么它不需要任何连接。
https://stackoverflow.com/questions/16803592
复制相似问题