Запрос Mysql для извлечения отсутствующей комбинации в таблице отношений

#mysql #database #combinations #relationship

#mysql #База данных #комбинации #связь

Вопрос:

У меня есть четыре таблицы (A, B, C и D). Таблица «D» имеет отношение FK из трех других таблиц. Каким будет запрос для извлечения всех идентификаторов из таблицы «A», которая не имеет полных комбинаций с идентификаторами записей таблиц B и C в таблице «D»? Пример:

Таблица A

 id  Value
1   Orange
2   Apple
3   Lemon
4   Strawberry
6   Grape
  

Таблица B

 id  value
1   Juice
2   Ice cream
  

Таблица C

 id  Value
1   $10
2   $20
  

Таблица D

 id  IdA IdB IdC Value
1   2   2   1   Desc 1
2   2   1   1   Desc 2
3   2   2   2   Desc 3
4   2   1   2   Desc 3
5   1   1   1   Desc 4
6   3   2   1   Desc 5
  

Как выбрать все идентификаторы из таблицы A, которые не имеют всех возможных комбинаций (связей) в таблице D как с IdB, так и с IdC? В приведенном выше примере только IdA = 2 содержит все комбинации, поэтому запрос вернет все идентификаторы из таблицы A, кроме id = 2.

Ответ №1:

Вы можете получить недостающие комбинации, используя этот запрос:

 select a.*, b.*, c.*
from tablea a cross join
     tableb b cross join
     tablec c left outer join
     tabled d
     on d.ida = a.id and d.idb = b.id and d.idc = b.id
where d.ida is null;
  

Если вам просто нужны недостающие значения из, tablea которые не имеют совпадений, тогда используйте group by и having :

 select a.*
from tablea a cross join
     tableb b cross join
     tablec c left outer join
     tabled d
     on d.ida = a.id and d.idb = b.id and d.idc = b.id
where d.ida is null
group by a.id
having sum(d.ida is null) > 0;