Mysql SQL计数+左联接+分组依据。。。缺少行

Mysql SQL计数+左联接+分组依据。。。缺少行,mysql,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 我当前

尝试列出表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
我当前的问题是,表1中表2中有0条记录的行不显示 我希望显示它们

您应该按table1.id分组

左连接确保表1中的所有行都显示在结果集中。那些在表2中没有对的将在字段table2.table1中显示为NULL。因此,原始GROUP BY子句为表1中未出现在表2中的所有行生成一行,而不是为表1的每行生成一行。

您应该按table1.id进行分组


左连接确保表1中的所有行都显示在结果集中。那些在表2中没有对的将在字段table2.table1中显示为NULL。因为您原来的GROUP BY子句为表1中未出现在表2中的所有行生成一行,而不是为表1中的每行生成一行。

您落入了mysql的非标准GROUP BY支持陷阱

将分组方式更改为列出表1的所有列:

group by table1.id, table1.name, etc
或在选择框中列出所有table1列的列位置:

group by 1, 2, 3, 4, etc 

或者使用子查询获取计数与id,并将table1加入其中。

您已落入mysql的非标准组支持陷阱

将分组方式更改为列出表1的所有列:

group by table1.id, table1.name, etc
或在选择框中列出所有table1列的列位置:

group by 1, 2, 3, 4, etc 

或者使用子查询获取计数与id,并将table1与之关联。

您需要的查询是:

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子句中,因为您可能确实希望将其作为筛选条件。 GROUPBY子句基于t1.id,因为当没有匹配项时,t2.IDITable1将为NULL。假设id是唯一的或是表1中的主键,只使用t1.id就可以了。 表别名不是严格必需的,但它们使查询更易于编写和读取。
您需要的查询是:

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子句中,因为您可能确实希望将其作为筛选条件。 GROUPBY子句基于t1.id,因为当没有匹配项时,t2.IDITable1将为NULL。假设id是唯一的或是表1中的主键,只使用t1.id就可以了。 表别名不是严格必需的,但它们使查询更易于编写和读取。
带where的左连接将转换为内部连接在x和y上移动连接条件上的where条件,而不是在x上移动连接条件,其中带where的左连接将转换为内部连接在x和y上移动连接条件上的where条件,而不是在x和y上移动连接条件上的where条件