MySQL имеет все значения - PullRequest
       4

MySQL имеет все значения

2 голосов
/ 11 ноября 2010

Это относится к моему последнему вопросу MySQL запрос с AND, OR и NOT

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

Я собираюсь выполнить запрос mysql, который возвращает мне все статьи, имеющие все необходимые темы.1011 *

Возможно ли это?Каков наилучший подход для этого?

Ответы [ 3 ]

3 голосов
/ 11 ноября 2010

В некоторых других ответах предлагается использовать псевдонимы в дочерней таблице для каждого предложения фильтра - это может быть неэффективно или плохо масштабироваться.

Рассмотрим:

SELECT x.*
FROM Article x INNER JOIN
(SELECT t.article_id, COUNT(t.article_id)
  FROM articleTopics t
  WHERE t.topic_id IN ([your_list_of_topics])
  GROUP BY t.article_id
  HAVING COUNT(t.article_id)>=[number of elements in [your_list_of_topics]]
  ORDER BY COUNT(t.article_id) DESC
  LIMIT 0,100) AS ilv
ON x.id=ilv.article_id

Еще одним преимуществом этого подхода является то, что структура запроса не должна изменяться в зависимости от количества тем, которые вы ищете - вы можете даже поместить их во временную таблицу и выполнить объединение вместо использования 'IN (...) 'буквально.

Вам нужно попробовать его, чтобы увидеть, какой запрос ведет себя лучше.

1 голос
/ 11 ноября 2010

Это делается с помощью нескольких объединений с одной и той же таблицей.

Чтобы выбрать все статьи, имеющие темы с идентификаторами 1, 2 и 3, вам необходимо сделать:

SELECT * FROM Article a
  INNER JOIN ArticleTopics at1 ON a.id = at1.article_id AND at1.topic_id = 1
  INNER JOIN ArticleTopics at2 ON a.id = at2.article_id AND at2.topic_id = 2
  INNER JOIN ArticleTopics at3 ON a.id = at3.article_id AND at3.topic_id = 3

// РЕДАКТИРОВАТЬ Починил это. Добавлены псевдонимы таблиц; Должно быть, я слишком долго работал с хорошими решениями ORM ...

0 голосов
/ 11 ноября 2010
SELECT
    *
FROM
    Article
WHERE
    (SELECT COUNT(*) FROM ArticleTopics
        WHERE Article.id = ArticleTopics.article_id AND
        ArticleTopics.topic_id=1) > 0 AND
    (SELECT COUNT(*) FROM ArticleTopics
        WHERE Article.id = ArticleTopics.article_id AND
        ArticleTopics.topic_id=2) > 0 AND
    (SELECT COUNT(*) FROM ArticleTopics
        WHERE Article.id = ArticleTopics.article_id AND
        ArticleTopics.topic_id=3) > 0 AND
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...