MySQL: выбор через ассоциацию - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть следующие таблицы MySQL:

Таблица company со следующими атрибутами (около 250 строк):

  • id_cpy (int)
  • name_cpy (varchar)
  • xxx_cpy (больше атрибутов компании)

Таблица event со следующими атрибутами (около 20 строк):

  • id_evt (int)
  • name_evt (varchar)
  • xxx_evt ((больше атрибутов события)

кросс-таблицаcpy_evt (около 550 строк) определяет, какая компания участвует в каком событии. Таблица содержит одну строку для каждой ассоциации между компанией и событием. Таблица содержит следующие атрибуты:

  • id_crs
  • id_cpy_crs
  • id_evt_crs

Из-за моих ограниченных знаний SQL у меня есть следующие вопросы.

Как выбрать:

  1. Все компании (все атрибуты), которые участвуют в событии A
  2. Все компании, которые участвуют в событии A Исобытие B
  3. Все компании, которые участвуют в мероприятии A ИЛИ событие B
  4. Все компании, которые не участвуют в каком-либо событии

Большое спасибо за вашу помощь!Ханнес

1 Ответ

0 голосов
/ 09 февраля 2019
  1. Все компании (все атрибуты), которые участвуют в событии A

Не зная ваших данных, я бы пошел на более безопасный подход, чтобы избежать потенциальных дубликатов:условие EXISTS с коррелированным подзапросом.

SELECT c.*
FROM company c
WHERE EXISTS (
    SELECT 1
    FROM company_event ce
    INNER JOIN event e ON e.name_evt = 'A' AND e.id_evt = ce.id_evt_crs
    WHERE ce.id_cpy_crs = c.id_cpy
)
Все компании, участвующие в событии А и событии B

Вы можете добавить дополнительное условие EXISTS:

SELECT c.*
FROM company c
WHERE EXISTS (
    SELECT 1
    FROM company_event ce
    INNER JOIN event e ON e.name_evt = 'A' AND e.id_evt = ce.id_evt_crs
    WHERE ce.id_cpy_crs = c.id_cpy
)
AND EXISTS (
    SELECT 1
    FROM company_event ce
    INNER JOIN event e ON e.name_evt = 'B' AND e.id_evt = ce.id_evt_crs
    WHERE ce.id_cpy_crs = c.id_cpy
)
Все компании, участвующие в событии A ИЛИ событие B

Измените условие равенства для имени события на условие IN.

SELECT c.*
FROM company c
WHERE EXISTS (
    SELECT 1
    FROM company_event ce
    INNER JOIN event e ON e.name_evt IN ('A', 'B') AND e.id_evt = ce.id_evt_crs
    WHERE ce.id_cpy_crs = c.id_cpy
)
Все компании, которые не участвуют ни в одном событии

Это упрощает подзапрос, поскольку нам не нужно присоединяться к таблице событий.

SELECT c.*
FROM company c
WHERE NOT EXISTS (
    SELECT 1
    FROM company_event ce
    WHERE ce.id_cpy_crs = c.id_cpy
)
...