根据结果​​中的项目排序,这些结果可能在rails中的连接表中,也可能不在

时间:2016-06-06 01:35:35

标签: sql ruby-on-rails postgresql

items(id)
user_items(id, user_id, item_id, status)

我有一张与itemshas_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

1 个答案:

答案 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 joingroup 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;