У меня есть этот запрос:
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" в результате RIGHT JOIN из таблицы "alumnos", потому что цель запроса состоит в том, чтобы получить все "pruebas", которые пользователь не выполнил, и те, которые у него уже есть сделанный...
Что я делаю неправильно?
Вот схема db
Это ожидаемый результат
Вы можете использовать этот запрос:
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;
Cross join получает все возможные комбинации, а затем проверяет, что существует в таблице результатов.
Вы делаете ПРАВОЕ СОЕДИНЕНИЕ на pruebas, у которого нет строки, можете ли вы ПРАВОЕ ПРИСОЕДИНЕНИЕ 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