MySQL LEFT JOIN с необязательным значением во второй таблице - PullRequest
23 голосов
/ 12 марта 2011

У меня есть две таблицы: projects и user_licenses.

Я хотел бы получить весь список проектов из базы данных, а также текущее состояние лицензии пользователя.Таблица лицензий имеет поле ID пользователя, которое я проверяю по переменной $_SESSION для значения.Дело в том, что у них может не быть лицензии, или незарегистрированный посетитель может захотеть увидеть список проектов.У меня такой вопрос: как я могу получить данные из левой таблицы всегда отображать, но только получить данные для этой строки из правой таблицы, когда выполняются определенные условия?

На данный момент у меня есть следующий запрос:

   SELECT Projects.*, 
          UserLicenses.* 
     FROM Projects 
LEFT JOIN UserLicenses ON Projects.id = UserLicenses.project_id 
    WHERE UserLicenses.user_id = 12 
 ORDER BY name ASC

Ответы [ 3 ]

41 голосов
/ 12 марта 2011

Добавьте любые дополнительные условия к предложению 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

Это вернет проекты без соответствующих лицензий.

3 голосов
/ 12 марта 2011

Переместите условие 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)

0 голосов
/ 24 мая 2015

Вы можете использовать LEFT JOIN

Если его условия совпадают, значения показывают, в противном случае нулевое значение показывает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...