2014-09-28 111 views
1

嘿,我尝试从一个表中选择一行,并在另一个表上选择两个匹配的条目。 的结构如下:MySQL选择具有两个匹配来自另一个表的匹配连接行的行

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

存在着在user_messagegroup两排,两个用户的ID和两次相同messagegroup_id。 我想选择这个用户在里面的消息组。

我不明白它..所以我希望得到一些帮助;)

回答

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 

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

如果你想返回只包含这两个用户,并且没有其他用户messagegroups ...

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值,则可以仅从内联视图查询中获得该值,而不需要对消息组表进行外部查询和连接操作。

相关问题