复杂的SQL查询的连接表在轨
问题描述:
订货我有三个表:复杂的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中。它必须快速。
答
返回匹配的关键字定列表中的至少一个,通过匹配关键字的数量下令所有帖子:
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
。
答
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;
答
这是假设你无论是在表中的参数(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
当你说,通过#有序的匹配,我认为你的意思降(大多数匹配首先)。
这是胜利。我无法编辑,但k.keyword_id应该是k.id,而p.post_id应该是p.id. 它虽然我想要,但这是很重要的。非常感谢! – 2009-12-21 05:42:37