У нас есть следующая структура в нашей дате:
Теперь мы хотим получить только те области, где у пользователя есть все необходимые лицензии.
Например:
**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 проблемы (запросы): сначала вам нужно найти все области, в которых у пользователя есть лицензия. Затем вам нужно найти все лицензии, требуемые областью
В зависимости от наличия дубликатов вы можете сделать это, подсчитав количество результатов для каждого запроса, но я буду запускать их отдельно, а затем сделать небольшое количество сравнений в программе, с которой вы отправили запрос 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
Документация по MySQL - Поддержка левого и правого соединения -
Если в есть строка, соответствующая предложению WHERE, но в B нет строки, которая соответствует условию ON, добавляется дополнительная строка B со всеми столбцами, установленными в NULL.
Так что да, вы можете получить NULL строки, если условие ON не выполнено. Поэтому я бы рекомендовал использовать INNER JOIN