在rails中通过具有顺序的habtm联接表进行复杂SQL查询

在rails中通过具有顺序的habtm联接表进行复杂SQL查询,sql,ruby-on-rails,ruby,activerecord,Sql,Ruby On Rails,Ruby,Activerecord,我有三张桌子: Posts Keywordings Keywords parens中的相关字段 职位 has_many :keywordings has_many :keywords, :through => :keywordings 关键词(post\u id、关键字\u id) 关键字(名称) 我想从一个列表中找到所有包含匹配任何关键字(按名称)的帖子,按匹配关键字的数量排序。我确信这一切都可以在SQL中完成,但我不知所措 如果我必须用Ruby做一些事情,可以,但最好都用SQL。它

我有三张桌子:

Posts
Keywordings
Keywords
parens中的相关字段

职位

has_many :keywordings
has_many :keywords, :through => :keywordings
关键词(post\u id、关键字\u id)

关键字(名称)

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


如果我必须用Ruby做一些事情,可以,但最好都用SQL。它必须是快速的。

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

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

当您说按#matched排序时,我假设您的意思是降序(大多数匹配首先进行)。

这假设您传入了一个表参数(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

当你说“按匹配的关键字排序”时,我认为你的意思是“降序”(首先是大多数匹配项)。

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

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

如果您只需要post id本身,只需使用子查询和
ORDER BY

这就是win。我无法编辑,但k.keyword\u id应该是k.id,p.post\u id应该是p.id。不过,它能按我的要求工作,这才是最重要的。非常感谢!这就是胜利。我无法编辑,但k.keyword\u id应该是k.id,p.post\u id应该是p.id。不过,它能按我的要求工作,这才是最重要的。非常感谢!