嘿我尝试从另一个上有两个匹配条目的表中选择一行。 结构如下:
----------------- ---------------------
| messagegroups | | user_messagegroup |
| | | |
| - id | | - id |
| - status | | - user_id |
| | | - messagegroup_id |
----------------- | |
---------------------
user_messagegroup中有两行,其中id为两个用户,两次都是相同的messagegroup_id。 我想选择这两个用户所在的消息组。
我不明白..所以我会感激一些帮助;)
答案 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值,则可以从内联视图查询中获取该值,而无需外部查询和对消息组表的连接操作。