MYSQL Select Statement с предложением IN и несколькими условиями - PullRequest
3 голосов
/ 30 марта 2012

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

comment table
id, userId, articleId .... etc etc

article table
id, userId .... etc etc

Data:  UserIds = 3, 10.   ArticleIds = 1, 2

Допустим, я пытаюсь найти все комментарии для определенного набора идентификаторов статей: 1,2

Я могу легко использоватьэтот запрос

select * from comments WHERE articleId IN(1,2)

Однако здесь он становится сложным.У меня есть запрос, который выполняется до запроса комментариев, который определяет соответствующие идентификаторы статьи.Эти идентификаторы находятся в массиве.Также в массиве есть соответствующие идентификаторы пользователей для каждой статьи.

Что я хочу сделать сейчас - это запросить таблицу комментариев только для статей в массиве (1,2) И только для тех комментариев, которые были сделаны первоначальным автором (3, 10).

Простой запрос, приведенный выше, вернет все комментарии для articleId 1 и 20. Так, например, я не могу выяснить, где добавить еще одно условие, которое говорит только комментарии для articleId 1, 20 И соответствующий userId, 3, 10.

Буду признателен за любую помощь или предложения!

Ответы [ 5 ]

1 голос
/ 30 марта 2012

Я думаю, что самый простой способ написать:

SELECT comments.*
  FROM articles
  JOIN comments
    ON articles.id = comments.articleId
   AND articles.userId = comments.userId
 WHERE articles.id IN (1, 2)
;

Предложение AND articles.userId = comments.userId обеспечивает соблюдение вашего требования «только для тех комментариев, которые были сделаны первоначальным автором».

В качестве альтернативы вы можете использовать предложение EXISTS:

SELECT *
  FROM comments
 WHERE articleId IN (1, 2)
   AND EXISTS
        ( SELECT 1
            FROM articles
           WHERE id = comments.articleId
             AND userId = comments.userId
        )
;

или однорядный подзапрос:

SELECT *
  FROM comments
 WHERE articleId IN (1, 2)
   AND userId =
        ( SELECT userId
            FROM articles
           WHERE id = comments.articleId
        )
;
1 голос
/ 30 марта 2012

Вы пробовали просто

select * from comments WHERE articleId IN(1,2) and authorId in (3,10)

Если нет, обновите свой вопрос, почему это так.

0 голосов
/ 30 марта 2012

- вы можете использовать подзапрос

select * from comments WHERE articleId IN(1,2)
and userId in ( select userId from article where id in (1,2) )
0 голосов
/ 30 марта 2012

Разве вы не можете просто сделать запрос, который сначала запускает подзапрос в пределах указанного запроса:

SELECT * FROM `comments` WHERE `articleId` IN(1,2) AND `userId` IN (__subquery__)
0 голосов
/ 30 марта 2012

Вы можете добавить столько IN операторов, сколько хотите:

select * from comments WHERE articleId IN(1,2) AND userId IN (3,10)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...