2017-06-23 65 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

你是男人! –