我有三张桌子:
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中。它必须很快。
答案 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
当你说,按#匹配排序时,我认为你的意思是降序(大多数匹配首先)。