MySQL LEFT JOIN с дополнительным значением во второй таблице
У меня две таблицы: projects
и user_licenses
.
Я хотел бы захватить весь список проектов из базы данных, а также состояние текущей лицензии пользователя. Таблица лицензий имеет поле идентификатора пользователя, которое я проверяю на переменную $_SESSION
для значения. Дело в том, что у них может не быть лицензии, или невостребованный посетитель может захотеть увидеть список проектов. Мой вопрос заключается в следующем: как я могу получить данные из левой таблицы, всегда отображаемые, но только захватывать данные для этой строки из правой таблицы при выполнении определенных условий?
В настоящий момент у меня есть запрос:
SELECT Projects.*,
UserLicenses.*
FROM Projects
LEFT JOIN UserLicenses ON Projects.id = UserLicenses.project_id
WHERE UserLicenses.user_id = 12
ORDER BY name ASC
Ответы
Ответ 1
Добавьте дополнительные условия в предложение on
левого соединения. Они будут влиять только на объединенную таблицу.
SELECT Projects.*,
UserLicenses.*
FROM Projects
LEFT JOIN UserLicenses
ON Projects.id = UserLicenses.project_id
and UserLicenses.user_id = 12
and UserLicences.Question = '6*7'
and UserLicences.Answer = 42
ORDER BY name ASC
Это приведет к возврату проектов без соответствующих лицензий.
Ответ 2
Переместите условие UserLicenses в сторону от WHERE и до состояния JOIN. Имея это в части WHERE, вы никогда не увидите эти "левые" строки, потому что они отфильтрованы.
Вы также можете использовать WHERE (UserLicenses.user_id = 12 OR UserLicenses.user_id IS NULL)
Не делай этого. Просто переместите его в условие соединения следующим образом:
LEFT JOIN UserLicenses ON
(Projects.id = UserLicenses.project_id AND UserLicenses.user_id = 12)
Ответ 3
Вы можете использовать LEFT JOIN
Если его условия совпадают, тогда значения показывают, что в противном случае отображается нулевое значение.