2017-06-23 64 views
0

我有五個表:用戶,興趣,動物,interest_animals,interest_users。Rails group by order

用戶 FOO

興趣1,2,3

動物1,2,3

FOO具有利益1,2,3

興趣1具有動物1,2 興趣2有動物1,2,3 興趣3有動物3

我需要返回所有動物s到foo的動物有序的利益ID分組計數利益

我想是這樣的:

SELECT animals.* FROM animals 
INNER JOIN interests_animals ON animals.id = interests_animals.animal_id 
INNER JOIN interests ON interests_animals.interest_id = interests.id 
INNER JOIN interests_users ON interests.id = interests_users.interest_id 
WHERE interests_users.user_id = XXX 
GROUP BY animals.id 
ORDER BY COUNT(interests_animals.animal_id); 

我需要的動物訂單2,1,3回,但總是返回1,2 ,3

回答

1

您需要明確地指定在SELECT子句中在其中執行GROUP BY的列。

SELECT子句中的所有其他部分必須像數骨料()和()等

請注意,我們使用count(不同..)在這裏,因爲每個動物ID可能會出現因多次的鏈連接:

SELECT 
    interests.id, 
    COUNT(DISTINCT animals.id) as animals_count 
JOIN interests_animals ON animals.id = interests_animals.animal_id 
JOIN interests ON interests_animals.interest_id = interests.id 
JOIN interests_users ON interests.id = interests_users.interest_id 
WHERE interests_users.user_id = XXX 
GROUP BY 1 
ORDER BY 2 desc; 

- 在GROUP BY和ORDER BY,通常方便的是使用只是數字 - 「1」 的意思是 「SELECT子句的第一列」 等。

另外,「INNER」是一個可選的關鍵字(簡單地「JOIN」和「INNER JOIN」是相同的)。

此外,作爲一個側面說明,你可能會發現有用的添加到您的SELECT子句:

, array_agg(animals.id order by animals.id) as animal_ids 

- 這會給你的涉及特別感興趣所有的動物ID的整數數組,有序。

+0

你是男人! –