我工作了几个小时才得到我想要的结果,但我的SQL代码却没有运气。我试图从一个表中选择所有记录,并从其他表中匹配记录。从一个表中选择所有记录并从其他表中匹配记录
请参阅现场示例here。从上面的例子
url_id short_url campaign Clicks
1 test1 campaign1 2
2 test2 campaign2 2
SQL代码:
SELECT u.url_id, u.short_url, c.campaign, Count(*) AS Clicks
FROM (urls u LEFT JOIN log l ON l.url_id = u.url_id) LEFT JOIN campaign c ON u.campaign_id = c.campaign_id
WHERE (((DATE_FORMAT(l.date_time, '%Y-%m-%d')) Between '2017-03-14' And '2017-03-17'))
GROUP BY u.url_id, u.short_url, c.campaign;
我想对结果是这样的。包含来自urls表的所有记录。
url_id short_url campaign Clicks
1 test1 campaign1 2
2 test2 campaign2 2
3 test3 campaign1 0
4 test4 0
我试图WHERE子句中加入l.url_id is null
但点击具有1,而不是零(0)
url_id short_url campaign Clicks
1 test1 campaign1 2
2 test2 campaign2 2
3 test3 campaign1 1
4 test4 1
SQL代码从上述样品的值:
SELECT u.url_id, u.short_url, c.campaign, Count(*) AS Clicks
FROM (urls u LEFT JOIN log l ON l.url_id = u.url_id) LEFT JOIN campaign c ON u.campaign_id = c.campaign_id
WHERE (((DATE_FORMAT(l.date_time, '%Y-%m-%d')) Between '2017-03-14' And '2017-03-17')) or l.url_id is null
GROUP BY u.url_id, u.short_url, c.campaign;
非常感谢。它的工作原理也比使用'is null'更快。 – jaypabs
@jaypabs我真的很惊讶,它比其他两个答案快,但从代码维护的角度来看,我认为我的查询更容易阅读和维护。如果你需要在查询中添加一个非聚合列,这很简单,但在你原来的方法中,情况可能不是这样。 –
是的。这比两个答案快得多,我为此感谢你。 – jaypabs