使用group by with left join和IN会产生空结果

时间:2017-10-14 09:39:57

标签: sql join group-by

我有两个表:inviteesinvitee_information。被邀请者属于events(第三个表event_id是invitees表中的外键)。

我想获得没有可用信息的每个活动的被邀请者总数(invitee_information表中没有记录)。

当我在where子句和反连接模式中使用一个event_id来编写查询时(invitee_id列的IS NULL来过滤没有保存信息的行),计数按预期返回对于那个给定的event_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_id获取此计数数据而不是在每个event_id的循环中获取此数据,我使用了IN并传递了多个event_ids并使用了GROUP_BY event_id

预期结果应该是(如果invitee_information表中没有为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 个答案:

答案 0 :(得分: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` = 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;