我有两个表:invitees
和invitee_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`;
答案 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;