items(id)
user_items(id, user_id, item_id, status)
我有一张与items
有has_many
关系的表user_items
。我想按“热门商品”排序,其中列表顶部的商品user_items
最多,status
为1(已批准)。
我想出的sql查询看起来有点难看,但似乎主要是做这个工作:
SELECT items.* FROM items LEFT OUTER JOIN user_items ON user_items.item_id = items.id
GROUP BY items.id, user_items.status
ORDER BY (user_items.status = #{UserItem.statuses[:approved]}) DESC NULLS LAST,
COUNT(items.id) DESC
问题在于我在结果中收到了重复的项目,所以我必须使用以下内容发布流程:Item.find_by_sql(sql).uniq{|item| item.id}
如何避免在此处拨打uniq
?是否有一个更有效的查询,我可以编写来完成同样的事情?是否有更简洁的方法在Rails中编写它,我不必使用find_by_sql
?
答案 0 :(得分:1)
如果你想要user_items
以上的项目,那么我会建议这样的查询:
select i.*,
(select count(*)
from user_items ui
where ui.item_id = i.it and ui.status = 1
) as numusers
from items i
order by numusers desc;
您可以使用left join
和group by
执行此操作:
SELECT i.*
FROM items i LEFT OUTER JOIN
user_items ui
ON ui.item_id = i.id AND ui.status = 1
GROUP BY i.id
ORDER BY COUNT(u.user_id) DESC;