mySQL запрос для поиска объекта, который связан со всеми объектами. Нет операции агрегации - PullRequest
0 голосов
/ 14 марта 2020

Запрос на поиск гаджетов, связанных со всеми гаджетами. Без использования какой-либо операции агрегирования.

CREATE TABLE `gadget`(
 `gadget` VARCHAR(10)
);

CREATE TABLE `relation`(
 `gadget1` VARCHAR(10),
 `relation` boolean,
 `gadget2` VARCHAR(10),
);

Мысль с таблицей relation состоит в том, что gadget1 имеет отношение к gadget2, если оно истинно.

Ответы [ 2 ]

0 голосов
/ 14 марта 2020

При наличии столбца relation в таблице relation (не очень хорошая практика иметь столбец с таким же именем, как у таблицы), который может быть true или false, я предполагаю, что эта таблица содержит все возможные пары гаджетов. Если это так, то все, что вам нужно, это NOT EXISTS:

select g.gadget 
from gadget g
where not exists (
  select 1 
  from relation r 
  where g.gadget in (r.gadget1, r.gadget2) and not r.relation
)

См. Упрощенную демоверсию .

0 голосов
/ 14 марта 2020

Следующее получает пары, которые НЕ связаны:

select g1.gadget as gadget1, g2.gadget as gadget2
from gadget g1 join
     gadget g2
     on g1.gadget <> g2.gadget left join -- presumably gadgets are not related to themselves       
     relation r
     on r.gadget1 = g1.gadget and r.gadget2 = g2.gadget
 where r.gadget1 is null

Затем вы хотите, чтобы гаджеты не были в этом списке:

select g.gadget
from gadget g left join
     (select g1.gadget as gadget1, g2.gadget as gadget2
      from gadget g1 join
           gadget g2
           on g1.gadget <> g2.gadget left join
           relation r
           on r.gadget1 = g1.gadget and r.gadget2 = g2.gadget
      where r.gadget1 is null
     ) gg
     on g.gadget = gg.gadget1
where gg.gadget1 not null;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...