Внутреннее соединение должно быть необязательным - PullRequest
0 голосов
/ 26 сентября 2019

Из моей таблицы personal Я хотел бы присоединиться к таблицам languages и payment:

SELECT GROUP_CONCAT(DISTINCT languages.language) AS languages, personal.city, payment.before 
FROM personal 
INNER JOIN languages ON languages.uid = personal.uid 
INNER JOIN payment ON payment.uid = personal.uid 
WHERE personal.uid = 36

Возвращение моего запроса:

| languages   |  city          | before  |
|-------------|:--------------:|--------:|
| NULL        |  NULL          | NULL    |

Этопотому что в моей таблице нет записи payment.Есть ли способ сделать 4-ю строку моего кода необязательной?Так что если payment.uid = personal.uid будет ложным, результат должен выглядеть следующим образом:

| languages   |  city          | before  |
|-------------|:--------------:|--------:|
| English     |  Chicago       | NULL    |

1 Ответ

2 голосов
/ 26 сентября 2019

Используйте LEFT JOIN, чтобы всегда получать строку:

SELECT GROUP_CONCAT(DISTINCT l.language) AS languages, p.city, pa.before 
FROM personal p LEFT JOIN
     languages l
     ON l.uid = p.uid LEFT JOIN
     payment pa
     ON pa.uid = p.uid 
WHERE p.uid = 36
GROUP BY p.city, pa.before;

Примечания:

  • Псевдонимы таблиц облегчают написание и чтение запроса.
  • У вас есть запрос агрегации с пустыми столбцами в SELECT, которых нет в GROUP BY.Это плохой SQL - и недопустимый (с настройками по умолчанию) в более поздних версиях MySQL.Научитесь правильно структурировать свои GROUP BY запросы.
  • Это не вернет ни одной строки, если ни одна строка не соответствует p.uid = 36.Однако он вернет строку, если она существует, даже если в других таблицах не существует строк.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...