【问题标题】:Get table 1 record that is common to mutiple table 2 records when there's a many to many relationship between tables当表之间存在多对多关系时,获取多个表2记录共有的表1记录
【发布时间】:2018-09-16 02:10:12
【问题描述】:

我有三个表,聊天、用户和聊天用户,其中聊天可以有多个用户,用户可以有多个聊天。我想获得所有给定用户 ID 共有的聊天。

聊天(id)

用户(id)

chat_user(id、chat_id、user_id)

我想获得属于用户 1 和 5 或多个用户 ID 的聊天

编辑

我正在使用 Laravel 框架,所以如果有办法通过其中一个父表(用户、聊天)获取结果会更好。

但我们将不胜感激。

【问题讨论】:

  • 您编写的查询有什么问题?可以展示一下吗?
  • @Cid 我写了一个,但结果证明它是一个非常愚蠢的输出,它输出的结果甚至不接近我预期的输出。所以我认为这不会有帮助:(

标签: mysql


【解决方案1】:

您可能需要加入表chats(包含您想要的信息的表)和表chat_user(包含聊天和用户ID的表)以应用where子句连接表。

在 Laravel 中,我不知道。

SELECT c.*
FROM `chats` c
JOIN `chat_user` cu
    ON c.id = cu.chat_id
WHERE cu.chat_id NOT IN (
    SELECT cuu.chat_id
    FROM chat_user cuu
    WHERE cuu.user_id NOT IN (1, 5))

【讨论】:

  • 还有其他聊天,用户 1 和 5 也是其中的一部分,因此 IN caluse 也提供了所有其他聊天 ID。例如,在 1 和 5、1 和 3、3 和 5 之间有聊天。所以这也给出了这些聊天 id。我只想获得 1 到 5 之间的聊天。无论如何感谢您的尝试 :)
  • 好吧我先没看懂,1到5之间的聊天
  • 1 和 5 之间只能有一个聊天,所以 1 和 5 之间只能聊天 :) 这就是我要使用此验证的内容
  • @RavishaHesh 这可以完成这项工作
  • 这个输出也不是我所期望的,由于某种原因,这也输出了与用户 2 和 6 的聊天。但这让我从不同的角度寻找解决方案。所以再次感谢
【解决方案2】:

我猜userId 将是这里的输入参数?试试下面的查询:

SELECT
*
from
chats
WHERE
id in (
SELECT
  chat_id
from
  chat_user
WHERE
  user_id = '1'
  OR user_id = '5'
group by
  chat_id
having
  count(*) = 2
)

count(*)=2 将确保只有用户 15 都存在的那些聊天。

【讨论】:

  • 嗯,这个和我写的有点相似,但是第 1 期,可能有超过 2 个用户,第 2 期就像我评论 Cid 的答案一样,可以有多个聊天,其中用户 1 和5 是的一部分
  • WHERE 子句将仅过滤那些 user_id 为 1 或 5 的记录,并且 count()=2 条件仅放置在这些记录上。这应该确保 1 和 5 都存在的聊天。如果有更多用户,count() = x(其中 x 是用户数)和 where 条件应该有效。
  • 问题是当有两个以上的用户时,我必须对每个用户重复 OR 条件
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多