跨habtm连接表的复杂SQL查询以及在rails中的排序

时间:2009-12-21 04:15:43

标签: sql ruby-on-rails ruby activerecord

我有三张桌子:

Posts
Keywordings
Keywords

parens中的相关字段。

帖子

has_many :keywordings
has_many :keywords, :through => :keywordings

关键字(post_id,keyword_id)

belongs_to :post
belongs_to :keyword

关键字(名称)

has_many :keywordings
has_many :posts, :through => :keywordings

我想查找所有包含与列表中任何(按名称)匹配的关键字的帖子,按照匹配的关键字数排序。我确信这一切都可以在SQL中完成,但我不知所措。

如果我必须在Ruby中做一些事情,那很好,但最好是在SQL中。它必须很快。

3 个答案:

答案 0 :(得分:1)

返回至少与给定关键字列表中的一个匹配的所有帖子,按匹配关键字的数量排序:

select p.*
from (
    select kw.post_id, count(*) as relevance
    from keywordings kw
    inner join keywords k on kw.keyword_id = k.id
    where k.name in ('foo', 'bar')
    group by kw.post_id) pkw 
inner join posts p on pkw.post_id = p.id
order by pkw.relevance desc;

如果您只想要自己的帖子ID,只需使用子查询和ORDER BY

答案 1 :(得分:0)

select post, count(*) from (
select distinct ks.post_id as post, ks.keywordings_id from keywordings ks
 join keyword k on ks.keyword_id = k.keyword_id
 where k.name in (list))
group by post
order by 2 desc;

答案 2 :(得分:0)

这假定您已传入表参数(SQL 2008)或在本地创建一个参数:

SELECT
     KW.post_id,
     COUNT(*) AS number_matched
FROM
     @keyword_list KL
INNER JOIN Keywords K ON
     K.keyword = KL.keyword
INNER JOIN Keywordings KW ON
     KW.keyword_id = K.keyword_id
GROUP BY
     KW.post_id
ORDER BY
     number_matched DESC

当你说,按#匹配排序时,我认为你的意思是降序(大多数匹配首先)。