Есть ли в MySQL что-то вроде IN, но в котором вместо AND используется AND? - PullRequest
5 голосов
/ 18 мая 2010

Мне нужен оператор SQL для получения записей, где его ключ (или любой столбец) находится в ассоциированной таблице, например:

documentId termId
4             1
4             2
3             3
5             1

Это:

SELECT documentId 
  FROM table 
 WHERE termId IN (1,2,3)

... извлечет любое значение documentid, где значение termid равно 1 или 2 или 3.

Есть ли что-то подобное, но возвращаются значения documentid, где значения termid равны 1 и 2 и 3? Как IN, но с AND.

1 Ответ

7 голосов
/ 18 мая 2010

Нет прямой функциональности, но есть два варианта:

Использование GROUP BY / HAVING


  SELECT t.documentid
    FROM TABLE t
   WHERE t.termid IN (1,2,3)
GROUP BY t.documentid
  HAVING COUNT(DISINCT t.termid) = 3

Предостережение заключается в том, что вы должны использовать HAVING COUNT(DISTINCT, потому что дубликаты termid, равные 2 для одного и того же документа, будут ложноположительными. И COUNT должен равняться количеству значений termid в предложении IN.

Использование JOINs


SELECT t.documentid
  FROM TABLE t
  JOIN TABLE x ON x.termid = t.termid
              AND x.termid = 1
  JOIN TABLE y ON y.termid = t.termid
              AND y.termid = 2
  JOIN TABLE z ON z.termid = t.termid
              AND z.termid = 3

Но это может быть проблемой для критериев, которые сильно меняются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...