【问题标题】:MySQL Joining 3 Tables Not Returning All ResultsMySQL加入3个表不返回所有结果
【发布时间】:2014-06-16 18:04:38
【问题描述】:

目标

正确连接 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 总数为 5 时,查询仅返回 4 行。 tag4 和 tag5 都没有连接,但仍然返回 tag4。无论tagmap 表中是否有任何连接,我都需要返回所有tags


问题

无论tagmap 连接如何,如何正确编写此查询以包含所有tags

提前致谢!

【问题讨论】:

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


    【解决方案1】:

    尝试GROUP BY tags.id,您将按tagmaptag 列对结果进行分组,该列不包含标签表中的所有关联

    SELECT
            tags.id AS tagid,
            tags.tag,
            tags.submitted_on AS date,
            users.id AS userid,
            CONCAT(users.first, ' ', users.last) AS username,
            count(tm.tl) AS tls,
            count(tm.users) AS users,
            count(tm.comms) AS comms,
            count(tm.events) 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 tags.id
            ORDER BY tags.id ASC
    

    Demo

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2012-10-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-06-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多