繁体   English   中英

从一个表中选择所有记录,从另一表中选择匹配的记录

[英]Select All Records From One Table And Matching Record From Other Table

我工作了几个小时,只是为了获得想要的SQL代码结果,但是没有运气。 我正在尝试从一个表中选择所有记录,并从另一表中选择匹配的记录。

请在此处查看实时示例。

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; 

我想要的结果是这样的。 包括网址表中的所有记录。

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; 

使用COUNT(l.id)代替COUNT(*)

WHERE子句中添加l.date_time IS NULL

检查http://rextester.com/YOX73980

SELECT u.url_id, u.short_url, c.campaign, Count(l.id) 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 l.date_time IS NULL OR (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; 

从概念上讲,仅汇总log表可能会更容易,因为这是生成点击计数的原因,而不是其他表。 按照这些原则,我们可以尝试以下查询:

SELECT t1.url_id,
       t1.short_url,
       COALESCE(t2.campaign, 'NA') AS campaign,
       COALESCE(t3.num_clicks, 0) AS Clicks
FROM urls t1
LEFT JOIN campaign t2
    ON t1.campaign_id = t2.campaign_id
LEFT JOIN
(
    SELECT url_id, COUNT(*) AS num_clicks
    FROM log
    WHERE DATE_FORMAT(date_time, '%Y-%m-%d') BETWEEN '2017-03-14' AND '2017-03-17'
    GROUP BY url_id
) t3
    ON t1.url_id = t3.url_id;

输出:

在此处输入图片说明

演示在这里:

右旋酯

SELECT u.url_id, u.short_url, c.campaign, Count(c.campaign_id) 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 
AND (((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; 

检查演示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM