Использование SQL условного AND в объединяемой таблице для обеспечения соответствия как минимум двух или нескольких значений - PullRequest
4 голосов
/ 16 марта 2012

У меня есть таблица соединений с именем languages_services, которая в основном объединяет таблицы services и languages.

Мне нужно найти службу, которая сможет обслуживать и АНГЛИЙСКИЙ (language_id=1), и ЭСПАНОЛ (language_id=2).

table languages_services
------------------------
service_id | language_id
------------------------
 1         |  1
 1         |  2
 1         |  3
 2         |  1 
 2         |  3

С данными, представленными выше, я хочу проверить language_id=1 AND language_id=2, где результат будет выглядеть следующим образом

QUERY RESULT
------------
service_id
------------
 1

Очевидно, он не возвращает тот, у которого service_id = 2, потому что он не обслуживает Espanol.

Любые советы по этому вопросу с благодарностью!

1 Ответ

5 голосов
/ 16 марта 2012
SELECT
  service_id
FROM
  language_services
WHERE
     language_id = 1
  OR language_id = 2
GROUP BY
  service_id
HAVING
  COUNT(*) = 2

Или ...

WHERE
  lanaguage_id IN (1,2)
GROUP BY
  service_id
HAVING
  COUNT(*) = 2

Если вы всегда смотрите на 2 языка, вы можете сделать это с помощью объединений, но агрегатную версию легче адаптировать к разному числу language_ids. (Добавьте ИЛИ или добавьте элемент в список IN и измените значение COUNT(*) = 2 на COUNT(*) = 3 и т. Д. И т. Д.).

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

1011 *
*

РЕДАКТИРОВАТЬ Пример использования объединения для 2 языков

SELECT
  lang1.service_id
FROM
  language_services   AS lang1
INNER JOIN
  language_services   AS lang2
    ON lang1.service_id = lang2.service_id
WHERE
      lang1.language_id = 1
  AND lang2.language_id = 2
...