【问题标题】:Having issue selecting rows by the same count按相同计数选择行时出现问题
【发布时间】:2019-10-12 15:19:13
【问题描述】:

有以下表格:

应满足以下条件:

  1. 选择主要由sender_id = 9 完成。这是一个主要的限制条件。
  2. receiver_id 的值不能与sender_id 列匹配。应该只选择那些行。

我想做的是:

SELECT DISTINCT
    receiver_id 
FROM 
    users_messages 
GROUP BY 
    receiver_id ,
    sender_id
HAVING 
    COUNT(receiver_id) = COUNT(sender_id) AND sender_id = 9 AND receiver_id != 9

由此,我预计输出仅为10。但问题是,它还选择了2,这打破了上述第二个条件。

这个查询有什么问题?

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    这是你想要的吗?

    select um.*
    from user_messages um
    where rm.sender = 9 and
          not exists (select 1
                      from user_messages um2
                      where um2.sender = um.receiver
                     );
    

    如果您只想要接收者,您当然可以使用select distinct um.receiver

    【讨论】:

    • 就是这样。但是既然你的回答暗示了一个子查询,那么当数据开始增长时,它真的会变得越来越慢吗?
    • 确保[not]exists 运行速度快,主要是@Yang
    • @杨。 . .如果性能是一个问题,那么您需要在user_messages(sender, receiver) 上建立索引。
    【解决方案2】:

    您可以进行左自连接并返回不匹配的行:

    select distinct u1.receiver_id
    from users_messages u1 left join users_messages u2
    on u2.sender_id = u1.receiver_id and u2.receiver_id = u1.sender_id
    where u1.sender_id = 9 and u2.id is null
    

    【讨论】:

      【解决方案3】:

      最简单、快速、合乎逻辑的解决方案

      SELECT * FROM `some` 
      WHERE sender_id = 9 AND receiver_id NOT IN (SELECT DISTINCT sender_id FROM some)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-03-02
        • 1970-01-01
        • 2015-02-26
        • 1970-01-01
        相关资源
        最近更新 更多