English 中文(简体)
MySQL跨表 Count(*) 查询帮助
原标题:
  • 时间:2008-11-06 09:46:28
  •  标签:
SELECT `name` , COUNT(*) AS `count`
FROM `t1`, `t2`
WHERE `t2`.`id` = `t1`.`id`
GROUP BY `t2`.`id`

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

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

编辑:我希望能够按计数降序排序。(或名称 ASC),这可能吗?

最佳回答

这对你应该有效:

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 不为 null(也就是那些实际存在于 t2 中的记录)时才进行计数。

问题回答

这按COUNT降序排列,对于相同的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。

进行联合以获取另一个集合。

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`)




相关问题