MySQL连接显示表a的成员在表b中为空但反之亦然

时间:2011-05-27 18:03:30

标签: mysql join

我确信之前已经问过这个问题,我很抱歉再次提出这个问题,但我已经做了一些搜索,可能是因为错误的条款而且找不到合适的方法。

我有两张桌子。网站是一个网站列表(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;

网站表中有五个网站,但其中一个网站尚未发送任何用户。那个问题没有显示在查询中。

有什么想法吗?

3 个答案:

答案 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;