Получить только строки, где встречаются все необходимые типы

0

У нас есть следующая структура в нашей дате:

Изображение 174551

  • Область может иметь один или несколько типов ticket_types.
  • Тип ticket_type может иметь один или несколько требуемых типов license_types.
  • Пользователь может иметь одну или несколько лицензий.
  • Лицензия имеет один license_type.

Теперь мы хотим получить только те области, где у пользователя есть все необходимые лицензии.

Например:

**required_license_types:**
ticket_type_id: 1 | licenses_type_id: 1
ticket_type_id: 1 | licenses_type_id: 2

**licenses**
user_id: 1 | license_type_id: 1
user_id: 1 | license_type_id: 3
user_id: 1 | license_type_id: 4

Мы думали о LEFT JOIN, но потом мы получим также строки с NULL, которые MIN can not process.

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

Есть идеи, как это решить?

заранее спасибо!

Теги:

2 ответа

1
Лучший ответ

Что касается базы данных, у вас есть 2 проблемы (запросы): сначала вам нужно найти все области, в которых у пользователя есть лицензия. Затем вам нужно найти все лицензии, требуемые областью

В зависимости от наличия дубликатов вы можете сделать это, подсчитав количество результатов для каждого запроса, но я буду запускать их отдельно, а затем сделать небольшое количество сравнений в программе, с которой вы отправили запрос SQL.

Чтобы не возвращать строки, которые имеют NULL-поля, вы хотите INNER JOIN

т.е.

SELECT * from licenses AS l WHERE u.id = '<the user>'
INNER JOIN required_license_types AS rlt ON rlt.license_type_id = l.license_type_id
INNER JOIN ticket_types AS tt ON a.id = tt.area_id
INNER JOIN users AS u ON l.user_id = u.id

а также

SELECT * from required_license_types AS rlt WHERE a.id = '<the area>'
INNER JOIN ticket_types AS tt ON tt.id = rtl.ticket_type_id
INNER JOIN areas AS a ON tt.area_id = a.id 
  • 0
    благодарю вас. Ваш ответ привел нас к нашему решению. Нам пришлось сделать все наоборот, чтобы мы опрашивали все, где получаем NULL, а затем исключали их.
0

Документация по MySQL - Поддержка левого и правого соединения -

Если в есть строка, соответствующая предложению WHERE, но в B нет строки, которая соответствует условию ON, добавляется дополнительная строка B со всеми столбцами, установленными в NULL.

Так что да, вы можете получить NULL строки, если условие ON не выполнено. Поэтому я бы рекомендовал использовать INNER JOIN

Ещё вопросы

Сообщество Overcoder
Наверх
Меню