MySql все строки, которые имеют отношение c или не имеют отношения - PullRequest
0 голосов
/ 17 июня 2020

Я выполняю сложный запрос между двумя таблицами. Мне нужны строки, которые имеют отношение c, а те, у которых его нет.

Например:

Элемент

|---------------------|------------------|
|          id         |       name       |
|---------------------|------------------|
|          1          |         a        |
|---------------------|------------------|
|          2          |         b        |
|---------------------|------------------|
|          3          |         c        |
|---------------------|------------------|

Атрибуты элемента

|------------------|--------------------|
|    id_element    |      id_attribute  |
|------------------|--------------------|
|         1        |         55         |
|------------------|--------------------|
|         1        |         78         |
|------------------|--------------------|
|         3        |         55         |
|------------------|--------------------|

Мне нужны все элементы, у которых нет атрибута 78, поэтому в этом примере он должен выводить 2 и 3.

Я пробовал с

SELECT *
FROM element
LEFT JOIN element_attributes
ON (element.id = element_attributes.id_element AND element_attributes.id_element != 78)

Но для Например, для элемента 1 он выполняет левое соединение с первой строкой атрибутов и равен 55, поэтому он заканчивается результатами, а это не то поведение, которого я ожидал.

Спасибо

1 Ответ

1 голос
/ 17 июня 2020

Используйте not exists:

select e.*
from element e
where not exists (select 1
                  from element_attributes ea
                  where ea.id_element = e.id and e.id_element = 78
                 );
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...