MySQL选择具有来自另一个表的两个匹配连接行的行

时间:2014-09-28 04:25:10

标签: mysql sql database select join

嘿我尝试从另一个上有两个匹配条目的表中选择一行。 结构如下:

-----------------   ---------------------
| messagegroups |   | user_messagegroup |
|               |   |                   |
| - id          |   | - id              |
| - status      |   | - user_id         |
|               |   | - messagegroup_id |
-----------------   |                   |
                    ---------------------

user_messagegroup中有两行,其中id为两个用户,两次都是相同的messagegroup_id。 我想选择这两个用户所在的消息组。

我不明白..所以我会感激一些帮助;)

1 个答案:

答案 0 :(得分:1)

您提供的规范并不是很清楚。

你说"使用两个用户的ID" ...如果我们认为你想在查询中提供两个user_id值,那么一种方法来查找包含的消息组这两个特定用户:

SELECT g.id
     , g.status
  FROM messagegroups g
  JOIN ( SELECT u.messagegroup_id
           FROM user_messagegroup u
          WHERE u.user_id IN (42, 11)
          GROUP BY u.messagegroup_id
         HAVING COUNT(DISTINCT u.user_id) = 2
       ) c
    ON c.messagegroup_id = g.id 

除了指定的两个用户之外,返回的消息组还可以包含其他用户。

如果要返回仅包含这两个用户的消息组,而不是其他用户...

SELECT g.id
     , g.status
  FROM messagegroups g
  JOIN ( SELECT u.messagegroup_id
           FROM user_messagegroup u
          WHERE u.user_id IS NOT NULL
          GROUP BY u.messagegroup_id
         HAVING COUNT(DISTINCT IF(u.user_id IN (42,11),u.user_id,NULL)) = 2
            AND COUNT(DISTINCT u.user_id) = 2
       ) c
    ON c.messagegroup_id = g.id

为了提高性能,您需要在表上使用合适的索引,并且可以重写这些索引以消除内联视图。

此外,如果您只需要messagegroup_id值,则可以从内联视图查询中获取该值,而无需外部查询和对消息组表的连接操作。