代码之家  ›  专栏  ›  技术社区  ›  Ali Malik

将group by与left join和IN一起使用会产生空结果

  •  0
  • Ali Malik  · 技术社区  · 8 年前

    我有两张桌子: invitees invitee_information events (第三个表event_id是 表)。

    我想获得每个活动的受邀者总数,其中还没有可用的信息(在 表)。

    event_id 在where子句和反连接模式中(对于 invitee_id 列以筛选未保存信息的行)对于给定的event\u id,按预期返回计数:

    SELECT COUNT(i.id)
    FROM invitees i
    LEFT JOIN invitee_information ii 
    ON ii.invitee_id = i.id
    WHERE ii.invitee_id IS NULL AND i.`event_id` = 18571 AND i.`invitation_sent` = 1;
    

    现在,为了优化查询以在DB级别获取多个event\u id的计数数据,而不是在每个event\u id的循环中获取这些数据,我使用并传递了多个event\u id,并使用GROUP\u BY 事件id .

    受邀者信息 event_id 18569表:

    event_id | count(i.id)
    18569    |          0
    

    但查询结果总是空的。我更新的查询是:

    SELECT i.`event_id`, COUNT(i.id)
    FROM invitees i
    LEFT JOIN invitee_information ii 
    ON i.id = ii.invitee_id
    WHERE ii.invitee_id IS NULL AND i.`event_id` IN(18569,18571) AND i.`invitation_sent` = 1
    GROUP BY i.`event_id`;
    
    1 回复  |  直到 8 年前
        1
  •  0
  •   Gordon Linoff    8 年前

    我能想象这种情况发生的唯一方式是,如果您有国际化设置,那么 , 表示小数点。您可以使用以下工具轻松测试这一点:

    SELECT i.`event_id`, COUNT(i.id)
    FROM invitees i LEFT JOIN
         invitee_information ii 
         ON i.id = ii.invitee_id
    WHERE ii.invitee_id IS NULL AND
          (i.`event_id` = 18569 OR i.`event_id` = 18571) AND
          i.`invitation_sent` = 1
    GROUP BY i.`event_id`;
    

    如果这可行,那么至少我们已经确定了问题所在。我认为一个空间可以工作:

    SELECT i.`event_id`, COUNT(i.id)
    FROM invitees i LEFT JOIN
         invitee_information ii 
         ON i.id = ii.invitee_id
    WHERE ii.invitee_id IS NULL AND
          i.`event_id` IN (18569, 18571) AND
          i.`invitation_sent` = 1
    GROUP BY i.`event_id`;
    

    COUNT(ii.invitee_id) SELECT 而不是 COUNT(i.id) . 后者永远不会回来 0 .

    编辑:

    也许是两个 事件 不在 invitees 桌子假设您有一个事件表,那么如下所示:

    SELECT e.event_id, COUNT(i.id)
    FROM events e LEFT JOIN
         invitees i
         ON i.event_id = e.event_id AND
            i.invitation_sent = 1 LEFT JOIN
         invitee_information ii 
         ON i.id = ii.invitee_id 
    WHERE ii.invitee_id IS NULL AND
          e.event_id IN (18569, 18571) AND
    GROUP BY e.event_id;