2009-12-21 56 views
1

订货我有三个表:复杂的SQL查询的连接表在轨

Posts 
Keywordings 
Keywords 

括号中的相关领域。

一个帖子

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中。它必须快速。

回答

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

+0

这是胜利。我无法编辑,但k.keyword_id应该是k.id,而p.post_id应该是p.id. 它虽然我想要,但这是很重要的。非常感谢! – 2009-12-21 05:42:37

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; 
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 

当你说,通过#有序的匹配,我认为你的意思降(大多数匹配首先)。