2013-06-12 64 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