首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >rails组按计数排序

问rails组按计数排序
EN

Stack Overflow用户
提问于 2017-06-23 11:30:14
回答 1查看 157关注 0票数 0

我有五个表: users,interests,animals,interests_animals,interests_users。

用户foo

利息1、2、3

动物1,2,3

foo有兴趣1,2,3

兴趣%1具有动物% 1,%2兴趣%2具有动物% 1,% 2,%3兴趣%3具有动物%3

我需要返回所有的动物通过利益分组的利益id的foo排序动物计数

我试着这样做:

代码语言:javascript
复制
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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-06-23 11:36:48

您需要在SELECT子句中显式指定GROUP BY的列。

SELECT子句的所有其他部分必须是聚合,如count()、sum()等。

请注意,我们使用count(distinct ..)因为由于连接链的原因,每个动物ID可能会出现多次:

代码语言:javascript
复制
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子句中很有用:

代码语言:javascript
复制
, array_agg(animals.id order by animals.id) as animal_ids

--这将为您提供与特定兴趣相关的所有动物ID的整数数组。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44712621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档