У меня есть две таблицы MySQL: users и task_reg

пользователи

id name
1  user1
2  user2
3  user3
4  user4
5  user5
6  user6
7  user7
8  user8
9  user9

task_reg

top_id  use_id  payment 
1       1       1 
1       2       1
1       4       1
2       3       1
2       5       1

Я должен отображать всех пользователей, а также показывать, заплатили они или нет

Вот моя команда SQL, но она показывает только платных пользователей

SELECT users.id, users.name, task_reg.payment
FROM task_reg
JOIN users ON users.id = task_reg.use_id
JOIN topics ON topics.id = task_reg.top_id
WHERE topics.id = 1

Результат

id  name    payment
1   user1   1
2   user2   1
4   user4   1

Ожидаемый результат

id  name    payment
1   user1   1
2   user2   1
3   user3   0
4   user4   1
5   user5   0
6   user6   0
7   user7   0
8   user8   0
9   user9   1

DB- Fiddle

Спасибо.

1
Sumithran 14 Окт 2018 в 13:46

1 ответ

Лучший ответ
  • Поскольку вам нужны все пользователи, это должна быть ваша первая таблица в порядке присоединения.
  • Измените свой Inner join на Left Join.
  • Условие Where для topics.id должно быть условием соединения.
  • Используйте функцию Coalesce() для получить значение выполненного платежа как 0 (из-за отсутствия совпадающих строк).

Пытаться:

SELECT users.id, users.name, COALESCE(task_reg.payment, 0) AS payment 
FROM users 
LEFT JOIN task_reg ON users.id = task_reg.use_id
LEFT JOIN topics ON topics.id = task_reg.top_id AND topics.id = 1
3
Madhur Bhaiya 14 Окт 2018 в 11:03