Как найти элементы без связи с таблицей MySQL - PullRequest
0 голосов
/ 20 сентября 2018

У меня проблема с исключением элементов в моем запросе MySQL.Я хочу получить всех животных, которые не имеют отношения к «Азии», например:

Мои таблицы выглядят так.

Table 'animals'
+----+--------------+
| id | name         |
+----+--------------+
|  1 | Tiger        |
|  2 | Lion         |
|  3 | Spider       |
|  4 | Bird         |
+----+--------------+

Стол 'континент'

+----+--------------+
| id | name         |
+----+--------------+
|  1 | Europe       |
|  2 | Asia         |
|  3 | Africa       |
+----+--------------+

Стол'Relations'

+----+--------+-----------+
| id | animal | continent |
+----+--------+-----------+
|  1 |      1 |         1 |
|  2 |      2 |         1 |
|  3 |      2 |         2 |
|  4 |      2 |         3 |
|  5 |      3 |         3 |
|  6 |      4 |         2 |
+----+--------+-----------+

Вот так выглядит мой запрос:

SELECT    a.`id`,
          a.`name`
FROM      a.`animals` AS a
LEFT JOIN `relations` AS r
       ON r.`animal` = a.`id`
WHERE     r.`continent` != 2
ORDER BY  a.`name` asc;

Проблема в том, что это дает мне следующий результат:

Lion
Spider
Tiger

Дело в том, что «Лев» имеет отношение к континенту Азия (ID 2) и не должен быть в результатах.Не могли бы вы помочь мне решить эту проблему?

Ответы [ 5 ]

0 голосов
/ 20 сентября 2018
select a.* from animal A where a.id not in(select animal from relations where continent=2);
0 голосов
/ 20 сентября 2018

Это потому, что у Льва есть отношения с другой страной, не Азией.То, что вы хотите сделать, это:

SELECT a.id, a.name 
FROM animals a
WHERE a.id NOT IN (
    SELECT DISTINCT r.animal FROM relations r WHERE r.continent = 2
)
ORDER BY a.name DESC;

;)

0 голосов
/ 20 сентября 2018

Используйте NOT EXISTS, чтобы показать только тех животных, к которым нет никакого отношения к азиатскому континенту:

select a.*
from animals a
where not exists (
  select 1
  from relations r
  join continent c on
    c.id = r.continent
  where c.name = 'Asia'
    and a.id = r.animal
)
0 голосов
/ 20 сентября 2018

Вы получаете liion, потому что у вас есть лев (id 2) в таблице отношений для континента АЗИЯ

возможно, вам нужно животное, которое отличается от континента только для Азии, тогда

    SELECT    a.`id`,
              a.`name`
    FROM      a.`animals` AS a
    LEFT JOIN `relations` AS r
           ON r.`animal` = a.`id`
    WHERE     r.`continent` != 2 
    AND a.id not in (
        select animal from relation where continent = 2
    )
    ORDER BY  a.`name` asc;
0 голосов
/ 20 сентября 2018

В одном варианте используется предложение EXISTS:

SELECT
    a.id, a.name
FROM animals a
WHERE NOT EXISTS (SELECT 1 FROM relations r INNER JOIN continent c
                      ON r.continent = c.id
                  WHERE a.id = r.animal AND c.name = 'Asia');

enter image description here

Демо

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

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