代码之家  ›  专栏  ›  技术社区  ›  rockstardev

当某个表没有值时联接表?

  •  0
  • rockstardev  · 技术社区  · 15 年前

    我有这些桌子:

    USER TABLE
    uid | name | role
        |      |
    1   | bob  | package 1
    2   | jill | package 2
    3   | pam  | package 1
    
    NODE TABLE
    nid | uid | type
        |     |
    1   | 1   | car
    2   | 1   | car
    3   | 1   | car
    4   | 2   | page
    5   | 1   | car
    6   | 3   | car
    

    如果我这样做:

    select u.uid, u.name, count(nid) as totalNodes from USER as u left join NODE on n.uid = u.uid where n.type = 'car' group by u.uid
    

    我最终得到:

    uid | name | totalNodes
        |      | 
    1   | bob  | 4
    3   | pam  | 1
    

    换句话说,吉尔被排除在外。为什么?我该怎么避免呢?也就是说,我希望jill也出现在列表中,但totalnodes为0(甚至为空)。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Macros    15 年前

    在尝试联接表之前,您需要执行聚合,因为您当前所做的是左联接,然后限制数据(此时Jill被排除在外),然后进行分组。如果在子查询中进行计数和限制,则可以将这些结果左键联接到所需输出的用户表中:

    SELECT u.uid, u.name, IFNULL(c.nodecount,0) AS `count`
    FROM USER u LEFT JOIN (
        SELECT uid, `type` , COUNT(nid) AS nodecount
        FROM node
        WHERE TYPE = 'car'
        GROUP BY uid, type
    ) AS c ON u.uid = c.uid
    
        2
  •  0
  •   Haim Evgi    15 年前

    使用 RIGHT JOIN 取而代之的是

    尝试:

    select u.uid, u.name, count(nid) as totalNodes from USER as u
    right join NODE on n.uid = u.uid where n.type IS NULL or n.type = 'car' group by n.uid
    

    请看这篇精彩的文章,一篇关于连接的直观解释:

    http://www.codinghorror.com/blog/2007/10/a-visual-explanation-of-sql-joins.html

    join的mysql语法:

    http://dev.mysql.com/doc/refman/5.0/en/join.html