Mysql 将1个表的结果与多个变量进行比较,发现共有性

Mysql 将1个表的结果与多个变量进行比较,发现共有性,mysql,laravel,eloquent,Mysql,Laravel,Eloquent,提前谢谢。我发现很难用语言来表达。我有一个名为“对话用户”的表。它包含以下列:id、user\u id和conversation\u id 我需要获取一个用户id列表,比如说4…可能是9,然后找到他们都有共同点但不包含任何其他用户id的对话id 这可以在一个查询中完成吗?如果没有,有人能给我指出正确的方向吗 谢谢 这是“集合中的集合”查询的一个示例。您可以为一组特定的用户构造它,如下所示: select cu.conversation_id from conversation_users cu

提前谢谢。我发现很难用语言来表达。我有一个名为“对话用户”的表。它包含以下列:id、user\u id和conversation\u id

我需要获取一个用户id列表,比如说4…可能是9,然后找到他们都有共同点但不包含任何其他用户id的对话id

这可以在一个查询中完成吗?如果没有,有人能给我指出正确的方向吗

谢谢

这是“集合中的集合”查询的一个示例。您可以为一组特定的用户构造它,如下所示:

select cu.conversation_id
from conversation_users cu
group by cu.conversation_id
having sum(cu.user = x) > 0 and
       sum(cu.user = y) > 0 and
       sum(cu.user = z) > 0 and
       sum(cu.user not in (x, y, z)) = 0;
having
子句中的每个条件(最后一个除外)都检查给定用户是否在对话中。最后一个检查是否没有其他用户在其中

如果将关心的用户存储在临时表或字符串中(采用可怕的逗号分隔格式),您仍然可以执行以下操作:

select cu.conversation_id
from conversation_users cu
group by cu.conversation_id
having count(distinct (case when find_in_set(cu.user, @USERLIST) > 0 then cu.user end)) = 
           1 + length(@USERLIST) - length(replace(@USERLIST, ',', '') and
       count(distinct cu.user_id) = 1 + length(@USERLIST) - length(replace(@USERLIST, ',', '') 

这意味着列表中匹配用户的数量等于列表的大小,而匹配用户的总数等于列表的大小。这两个条件表示列表中的所有成员都在对话中。

谢谢,这很有效。对于laravel,请使用此链接作为参考: