Сложный SQL-запрос к таблице соединений habtm с упорядочением по рельсам - PullRequest
1 голос
/ 21 декабря 2009

У меня есть три таблицы:

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. Это должно быть быстро.

Ответы [ 3 ]

1 голос
/ 21 декабря 2009

Возвращает все сообщения, которые соответствуют хотя бы одному из данного списка ключевых слов, упорядоченных по количеству совпадений ключевых слов:

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;

Если вы просто хотите сами идентификаторы сообщений, просто используйте подзапрос и ORDER BY.

0 голосов
/ 21 декабря 2009

Предполагается, что вы либо передали параметр таблицы (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

Когда вы говорите, что упорядочено по # соответствию, я предполагал, что вы имели в виду убывание (большинство совпадений в первую очередь).

0 голосов
/ 21 декабря 2009
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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...