2013-06-12 29 views
1

我试图计算行了从MySQL返回的数字连接表,即:试图指望从MySQL返回的行数连接表

select *, count(pets.id) as pets_per_owner 
from owners 
left join pets 
    on owners.id=pets.owner_id 

的问题是所有参加行进行分组。

有没有什么办法可以得到这些小计,但显示所有行没有单独的查询返回(取消分组)?

TIA

回答

1

的问题是,您使用的是聚合函数没有GROUP BY所以结果被还原成单排。

MySQL对GROUP BY使用扩展,允许选择列表中的列出现在聚合函数或GROUP BY子句之外,但这可能会导致意外的结果。 (见MySQL Extensions to GROUP BY

从MySQL的文档:

MySQL的扩展使用GROUP BY的,这样的选择列表可参考在GROUP BY子句中未命名的非聚合列。 ...您可以使用此功能通过避免不必要的列排序和分组来获得更好的性能。但是,这非常有用,因为每个未在GROUP BY中命名的非聚合列中的所有值对于每个组都是相同的。服务器可以自由选择每个组中的任何值,因此除非它们相同,否则所选值是不确定的。此外,每个组的值的选择不能通过添加ORDER BY子句来影响。结果集的排序在选择值后发生,而ORDER BY不影响服务器选择的值。

为了解决这个问题,你应该做两件事,首先用select *替换你需要返回的列的实际名称。其次,在包含在未被汇总的选择列表中的列上使用GROUP BY。例如:

select owners.name, count(pets.id) as pets_per_owner 
from owners 
left join pets 
    on owners.id=pets.owner_id 
group by owners.name 

既然你在评论中贴出代码是很难确定你寻找什么,但如果你想要的宠物的名字与总数一起,你可以使用下列之一:

select o.name, 
    p.name pet_name, 
    p2.pets_per_owner 
from owners o 
left join pets p 
    on o.id = p.owner_id 
left join 
(
    select owner_id, count(*) pets_per_owner 
    from pets 
    group by owner_id 
) p2 
    on o.id = p2.owner_id 
    and p.owner_id = p2.owner_id; 

SQL Fiddle with Demo

或者你可以使用GROUP_CONCAT功能列出一个单列的宠物名字:

select owners.name, 
    group_concat(pets.name separator ', ') pet_name, 
    count(pets.id) as pets_per_owner 
from owners 
left join pets 
    on owners.id=pets.owner_id 
group by owners.name; 

SQL Fiddle with Demo

+0

'grpup' =>'group' – invisal

+0

@invisal - 你只需编辑答案 –

+0

我试过了,但#1不会让我长到编辑2个字符。 – invisal