2009-12-21 55 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 

當你說,通過#有序的匹配,我認爲你的意思降(大多數匹配首先)。