【问题标题】:Mysql find rows equal to some values but limited by countMysql查找等于某些值但受计数限制的行
【发布时间】:2017-12-01 03:05:20
【问题描述】:

我有一个对话应用程序,用户被分配到对话中。 一个对话可以有 1、2 或更多参与者,我使用表格将用户链接到对话:

当用户 5 想与用户 6 发起新对话时,我不想创建新对话,因为用户 5 和 6 已经有一个正在进行的 conversation_id。

他们实际上还与用户 10 进行了不同的群组对话

我有 2 个参数:用户 5 想要与 用户 6 交谈 如何查询此表以查找是否仅在这 2 个用户之间存在对话

我试过这个:

SELECT *,count(id) FROM `conversation_members`
WHERE user_id IN (5,6)
GROUP BY `conversation_id`

但是

  • 这也返回对话 id 2,而我希望有 只有 id 1,所以我想将选择查询限制为元素 计数为 2,如果我在失去能力之前进行分组 来匹配用户。
  • 这也返回 id 7,因为它匹配 2 个 user_id 中的 1 个 它应该同时匹配

最后我只想检索 ID 1,因为这是包括用户 5 和 6 以及 nobody else 的对话。这只能通过 Mysql 查询实现吗?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    你可以这样做:

    SELECT conversation_id
    FROM conversation_members
    GROUP BY conversation_id
    HAVING SUM(user_id IN (5, 6)) = 2 AND
           COUNT(*) = 2;
    

    这将返回包含这些成员的所有对话(如果有)。

    【讨论】:

    • 又好又简单,希望在这种情况下是防弹的
    【解决方案2】:

    在having子句中使用case表达式的总和以及count:

    SELECT conversation_id
    FROM conversation_members
    GROUP BY conversation_id
    HAVING SUM(case when user_id IN (5, 6) then 1 end) = 2 
    AND COUNT(*) = 2;
    

    使用这个HAVING SUM(user_id IN (5, 6)) = 2 的能力并不常见,我相信这是一种“MySQL 好奇心”。所以我建议你改用我认为更容易阅读/理解的 case 表达式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-07-27
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-06
      • 1970-01-01
      相关资源
      最近更新 更多