Выберите несколько элементов, которые соответствуют таблице сопоставления более одного раза - PullRequest
0 голосов
/ 22 февраля 2012

Я пытаюсь выбрать вопросы с определенным идентификатором темы. Эти совпадения хранятся в таблице сопоставления, но я не могу понять, как выбрать вопросы, для которых есть два тега, поскольку они хранятся в виде разных строк в таблице! Любая помощь, пожалуйста?

SELECT questions. * , posts.post, posts.id AS post_id, posts.created, users.id AS user_id, users.username, users.rep
FROM questions
LEFT JOIN posts ON questions.id = posts.question_id
LEFT JOIN users ON questions.user_id = users.id
LEFT JOIN topic_mapping ON questions.id = topic_mapping.question_id
WHERE topic_mapping.topic_id =49
OR topic_mapping.topic_id =50
GROUP BY questions.id
LIMIT 0 , 30

Ответы [ 2 ]

1 голос
/ 22 февраля 2012

Чтобы получить идентификаторы вопросов, используйте предложение HAVING:

SELECT
  questions.id
FROM questions LEFT JOIN topic_mapping ON questions.user_id = topic_mapping.question_id
WHERE topic_id = 49 OR topic_id = 50
GROUP BY questions.id
HAVING COUNT(DISTINCT topic_id) = 2

Результатом этого является список идентификаторов вопросов, которые затем можно объединить с остальной частью вашего запроса на questions.id, чтобы извлечь оставшиеся столбцы, не включенные в GROUP BY. Так что все выглядит так:

SELECT 
  questions.* , 
  posts.post,
  posts.id AS post_id,
  posts.created, 
  users.id AS user_id,
  users.username, 
  users.rep
FROM questions
JOIN (
    /* subquery gets the posts with 2 topics */
    SELECT
      questions.id
    FROM questions LEFT JOIN topic_mapping ON questions.user_id = topic_mapping.question_id
    WHERE topic_id = 49 OR topic_id = 50
    GROUP BY questions.id
    HAVING COUNT(DISTINCT topic_id) = 2
) qtopics ON questions.id = qtopics.id
LEFT JOIN posts ON questions.id = posts.question_id
LEFT JOIN users ON questions.user_id = users.id
LIMIT 0 , 30
1 голос
/ 22 февраля 2012

Чтобы найти вопросы, которым назначены обе темы , проверьте количество различных тем, найденных в предложении HAVING. Это число должно соответствовать числу тем, включенных в предложение WHERE.

SELECT questions. * , posts.post, posts.id AS post_id, posts.created, users.id AS user_id, users.username, users.rep
FROM questions
LEFT JOIN posts ON questions.id = posts.question_id
LEFT JOIN users ON questions.user_id = users.id
LEFT JOIN topic_mapping ON questions.id = topic_mapping.question_id
WHERE topic_mapping.topic_id IN (49,50)
GROUP BY questions.id
HAVING COUNT(DISTINCT topic_mapping.topic_id) = 2
LIMIT 0 , 30
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...