【问题标题】:MySQL Cross-Table Count(*) Query HelpMySQL 跨表计数(*)查询帮助
【发布时间】:2008-11-06 09:46:28
【问题描述】:
SELECT `name` , COUNT(*) AS `count` 从`t1`,`t2` WHERE `t2`.`id` = `t1`.`id` GROUP BY `t2`.`id`

我想从 t1 获取名称以及 t2 中 id 与 t1 相同的行数。

到目前为止,我已经获得了上述内容,但是如果 t2 中没有匹配的行,它将不会返回任何数据。如果没有行,我希望 count 为 0(或 NULL),并且名称仍然返回。

编辑:我希望能够按count 降序排序。 (或nameASC)这可能吗?

【问题讨论】:

    标签: sql mysql


    【解决方案1】:

    这应该适合你:

    SELECT `t1`.`id` , COUNT(`t2`.`id`) AS `count`
    FROM `t1` LEFT JOIN `t2` ON `t1`.`id` = `t2`.`id`
    GROUP BY `t1`.`id`
    

    左连接确保您拥有来自 t1 的所有行,并且 COUNT(t2.id) 使其仅计算 t2.id 不为空的记录(即 - 那些真正存在于 t2 中的记录)

    【讨论】:

    • 感谢您的帮助。我希望能够按count 降序排序。 (或nameASC)这可能吗?
    • 嗯...如果 t2 中有行,您的解决方案会为 count 显示“1”
    • 只需在最后添加“Order by count DESC”
    • 史蒂夫:如果它显示 1 - 也许你只是放了 COUNT(t1.id),而不是 COUNT(t2.id)?它有很大的不同......
    【解决方案2】:

    这按 COUNT 降序排序,在相同计数内按 name 升序排序。 t2 中没有行的名称将返回计数为 0。

    SELECT 
      `t1`.`name`, 
      COUNT(`t2`.`id`) AS `count`
    FROM 
      `t1` 
      LEFT JOIN `t2` ON`t2`.`id` = `t1`.`id`
    GROUP BY
      `t1`.`name`
    ORDER BY
      COUNT(`t2`.`id`) DESC,
      `t1`.`name`
    

    根据您的需要修改 ORDER BY。

    【讨论】:

    • 干杯,但是当 t2 中没有行时,count 显示 1
    【解决方案3】:

    做一个联合得到另一个集合

    SELECT `name` , COUNT(*) AS `count`
    FROM `t1`, `t2`
    WHERE `t2`.`id` = `t1`.`id`
    GROUP BY `t2`.`id`
    UNION
    Select name, 0 as count
    from t1
    where NOT EXISTS (select 1 from t2 where `t2`.`id` = `t1`.`id`)
    

    【讨论】:

    • 感谢您的帮助。这是最有效/最优雅的方式吗?有没有办法使用 JOIN 来做到这一点?
    猜你喜欢
    • 2012-07-07
    • 2011-09-19
    • 2011-11-07
    • 2011-07-19
    • 2011-04-28
    • 1970-01-01
    • 2014-11-01
    • 1970-01-01
    • 2011-11-05
    相关资源
    最近更新 更多