MySQL加入3个表没有返回所有结果

时间:2014-06-16 18:04:38

标签: mysql sql tags relational-database left-join

目标

正确加入3个表格以创建列表视图,以便快速识别创建标记的人员,时间以及使用次数。


表格设计

表:tags

 id    tag        type        submitted_on            submitted_by
------------------------------------------------------------------
  1    tag1       type1       0000-00-00 00:00:00      1
  2    tag2       type1       0000-00-00 00:00:00      1
  3    tag3       type1       0000-00-00 00:00:00      1
  4    tag4       type1       0000-00-00 00:00:00      1
  5    tag5       type1       0000-00-00 00:00:00      1

表:tagmap

 id    tag        type        tl    users    comms    events    submitted_on           submitted_by
----------------------------------------------------------------------------------------------------
  1      1        type1        2        0        0         0    0000-00-00 00:00:00    1
  2      1        type1      156        0        0         0    0000-00-00 00:00:00    1
  3      2        type1        2        0        0         0    0000-00-00 00:00:00    1
  4      3        type1        2        0        0         0    0000-00-00 00:00:00    1

表:users

 id    first      last
-----------------------
  1    John       Doe

查询

SELECT
        tags.id AS tagid,
        tags.tag,
        tags.submitted_on AS date,
        CONCAT(users.first, ' ', users.last) AS username,
        count(tm.tl) AS tls,
        count(tm.user) AS users,
        count(tm.comm) AS comms,
        count(tm.event) AS events
    FROM tags
        LEFT JOIN users
            ON users.id = tags.submitted_by
        LEFT JOIN tagmap AS tm
            ON tags.id = tm.tag
            GROUP BY tm.tag
        ORDER BY tags.id ASC

结果

 tagid    tag     date                   username     tls    users    comms    events
--------------------------------------------------------------------------------------
     1    tag1    0000-00-00 00:00:00    John Doe       2        0        0         0 
     2    tag2    0000-00-00 00:00:00    John Doe       1        0        0         0 
     3    tag3    0000-00-00 00:00:00    John Doe       1        0        0         0 
     4    tag4    0000-00-00 00:00:00    John Doe       0        0        0         0 

预期结果

 tagid    tag     date                   username     tls    users    comms    events
--------------------------------------------------------------------------------------
     1    tag1    0000-00-00 00:00:00    John Doe       2        0        0         0 
     2    tag2    0000-00-00 00:00:00    John Doe       1        0        0         0 
     3    tag3    0000-00-00 00:00:00    John Doe       1        0        0         0 
     4    tag4    0000-00-00 00:00:00    John Doe       0        0        0         0 
     5    tag5    0000-00-00 00:00:00    John Doe       0        0        0         0 

问题

当总共有tags时,查询只返回4行。 tag4和tag5都没有连接,但仍返回tag4。无论tags表中是否有任何连接,我都需要返回所有tagmap


问题

如何正确编写此查询以包含所有tags,而不管tagmap个连接是什么?

提前致谢!

2 个答案:

答案 0 :(得分:2)

尝试GROUP BY tags.id,您要按tagmap的{​​{1}}列对结果进行分组,该列没有您的代码表中的所有关联

tag

Demo

答案 1 :(得分:0)

我认为这是因为您根据表tagmap中的tag列对它们进行分组。尝试更改第一个标记(例如,4而不是1)并再次执行查询。结果可能会得到5行。