SQL Count + Left join + Group by ...缺少行

时间:2014-12-25 20:02:41

标签: mysql

尝试列出表1中的所有内容以及表2中的记录

表1每行都有一个id,表2中的每一行都有idontable1

select table1.*, count(table2.idintable1)as total
from   table1
       left join table2 on table1.id=table2.idintable1

 WHERE table1.deleted='0' AND table2.deleted=0
group by 
table2.idintable1

我当前的问题是来自table1的行,而不显示table2中的0条记录 我想让它们显示

3 个答案:

答案 0 :(得分:3)

您想要的查询是:

select t1.*, count(t2.idintable1) as total
from table1 t1 left join
     table2 t2
     on t1.id = t1.idintable1 and t2.deleted = 0
where t1.deleted = 0 
group by t1.id;

以下是更改:

  • t2.deleted上的条件已移至on子句。否则,这会将外部联接转换为内部联接。
  • t1.deleted条件中的条件仍然在where子句中,因为大概您确实希望将此作为过滤条件。
  • group by子句基于t1.id,因为如果没有匹配,t2.idintable1将为NULL。假设t1.id中的id是唯一的(或主键),只需使用table1即可。
  • 表别名不是严格必需的,但它们使查询更容易编写和阅读。

答案 1 :(得分:1)

你应该GROUP BY table1.id

LEFT JOIN确保table1中的所有行都出现在结果集中。那些table2中没有配对的人将在字段NULL中显示table2.idintable1。因此,原始GROUP BY子句为table1中未显示在table2中的所有行生成单行(而不是table1的每一行中的一行)

答案 2 :(得分:0)

你已经通过支持陷阱进入了mysql的非标准组。

更改您的论坛以列出表1的所有列:

group by table1.id, table1.name, etc

或列出select:

中所有table1列的列位置
group by 1, 2, 3, 4, etc 

或者使用子查询来获取计数与id,并将table1连接到该。

相关问题