我确信之前已经问过这个问题,我很抱歉再次提出这个问题,但我已经做了一些搜索,可能是因为错误的条款而且找不到合适的方法。
我有两张桌子。网站是一个网站列表(id |网站),cdd是一个用户列表和他们被引用的网站(userid | website | etc ..)。并非每个引用用户的网站都是赞助商,因此在网站表中。此外,并非每个赞助商网站都向我们发送了用户。我需要每个赞助商的用户数量列表,包括0。
这是我到目前为止的查询:
SELECT w.website, COUNT(*) AS num FROM websites w LEFT JOIN cdd c ON w.website = c.website WHERE c.submitted LIKE '05/26/11 %' GROUP BY w.website ORDER BY num DESC;
网站表中有五个网站,但其中一个网站尚未发送任何用户。那个问题没有显示在查询中。
有什么想法吗?
答案 0 :(得分:1)
我需要每个赞助商的用户数量列表,包括0。
在这种情况下,您可能应该使用左连接:
SELECT a.site, COUNT(b.ref_site) AS num FROM table1 a LEFT JOIN table2 b ON a.site = b.ref_site GROUP BY a.site;
答案 1 :(得分:1)
LEFT JOIN是正确的,但是因为您要在联接的右侧为表(cdd)指定WHERE子句,所以您将筛选出没有关联cdd记录的网站。你需要指定这样的标准:
[...]
FROM websites w
LEFT JOIN cdd c ON w.website = c.website
WHERE c.submitted IS NULL OR c.submitted LIKE '05/26/11 %'
[...]
包括不加入任何cdd记录的网站,或
[...]
FROM websites w
LEFT JOIN cdd c ON w.website = c.website AND c.submitted LIKE '05/26/11 %' 'Replaces WHERE clause
[...]
其中包含所有网站,但只加入具有匹配提交日期的cdds。
注意:为确保没有关联用户的网站返回0,您可能还需要COUNT()
cdd
列,而不是*
...
答案 2 :(得分:0)
让INNER JOIN成为LEFT JOIN,我觉得你很高兴。
SELECT a.site, COUNT(b.ref_site) AS num
FROM table1 a
LEFT JOIN table2 b
ON a.site = b.ref_site
GROUP BY a.site;