Получить левые поля таблицы, если правое объединение равно нулю на MySQL
У меня есть этот запрос:
SELECT
a.nombre,
a.apellidos,
p.nombre AS prueba,
IF(r.puntuacion IS NULL, 0, 1) AS prueba_realizada,
r.puntuacion,
r.id
FROM alumnos a
LEFT JOIN resultados r ON r.alumno_id = a.id
RIGHT JOIN pruebas p ON p.id = r.prueba_id
И у меня есть этот результат:
Мне нужно получить поля "nombre" и "apellidos" в правом результате соединения из таблицы "alumnos", потому что цель запроса - получить все "pruebas", которые пользователь не сделал, и те, которые он уже сделал сделанный...
Что я делаю не так?
Вот схема БД
Это ожидаемый результат
2 ответа
Решение
Можете ли вы попробовать использовать этот запрос:
SELECT pa.nombre, pa.apellidos, pa.prueba,
IF(r.puntuacion IS NULL, 0, 1) AS prueba_realizada,
r.puntuacion,
r.id
FROM
resultados r RIGHT JOIN
(SELECT a.id alumno_id,
a.nombre,
a.apellidos,
p.id prueba_id,
p.nombre AS prueba
FROM pruebas p CROSS JOIN alumnos a) pa
ON r.alumno_id = pa.alumno_id
AND r.prueba_id = pa.prueba_id;
Перекрестное соединение получает все возможные комбинации, а затем проверяет, что существует в таблице результатов.
Вы делаете RIGHT JOIN на pruebas, у которого нет ряда, вы можете RIGHT JOIN на pruebas на выпускниках? некоторые как a.id= p.id
SELECT
a.nombre,
a.apellidos,
p.nombre AS prueba,
IF(r.puntuacion IS NULL, 0, 1) AS prueba_realizada,
r.puntuacion,
r.id
FROM alumnos a
LEFT JOIN resultados r ON r.alumno_id = a.id
RIGHT JOIN pruebas p ON p.id = a.id