首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >用于查找与另一行具有相同值的所有行的Mysql查询

用于查找与另一行具有相同值的所有行的Mysql查询
EN

Stack Overflow用户
提问于 2013-05-29 08:26:25
回答 4查看 17.4K关注 0票数 5

我的数据库包含通常如下所示的行:

代码语言:javascript
复制
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列与数据库中这两个列的其他记录相匹配的所有实际记录。

代码语言:javascript
复制
| 1  |   123    |   456
| 2  |   123    |   456
| 5  |   123    |   456

| 4  |   444    |   456
| 7  |   444    |   456

我该如何着手获取这些结果呢?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-05-29 08:29:49

您可以使用连接来处理重复的记录。

代码语言:javascript
复制
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

  • SQLFiddle Demo

输出

代码语言:javascript
复制
╔════╦══════════╦════════╗
║ ID ║ PERSONID ║ ITEMID ║
╠════╬══════════╬════════╣
║  1 ║      123 ║    456 ║
║  2 ║      123 ║    456 ║
║  5 ║      123 ║    456 ║
║  4 ║      444 ║    456 ║
║  7 ║      444 ║    456 ║
╚════╩══════════╩════════╝
票数 8
EN

Stack Overflow用户

发布于 2013-05-29 08:31:28

下面这样的代码应该能起到作用:

代码语言:javascript
复制
SELECT P1.*
FROM PersonItem P1
INNER JOIN PersonItem P2 ON P2.ID <> P1.ID
AND P2.PersonId = P1.PersonId
AND P2.ItemId =   P1.ItemId
票数 4
EN

Stack Overflow用户

发布于 2013-05-29 08:28:59

您需要找到personid/itemid对出现多次的示例。在MySQL中,您可以使用where子句和子查询来执行此操作:

代码语言:javascript
复制
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语句。所以这可以写成:

代码语言:javascript
复制
select t.*
from t
where (t.personid, t.itemid) in (select personid, itemid
                                 from t
                                 group by personid, itemid
                                 having count(*) > 1
                                )

我喜欢的另一种选择,基于尤金的答案,但更有效,是:

代码语言:javascript
复制
SELECT t.personid, t.ItemId, GROUP_CONCAT(t.ID)
FROM t
GROUP BY t.personid, t.ItemId
HAVING COUNT(*) > 1;

如果您不介意以列表形式而不是单独的行形式获取ids,那么它不需要任何连接。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16803592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档