MySQL Выбрать из нескольких таблиц и самую последнюю запись

У меня проблемы с запросом выбора, и я не могу понять, как исправить. У меня две таблицы:

TABLE_students

|--------|------------|--------|
| STU_ID |   EMAIL    |  NAME  |
|--------|------------|--------|
|   1    | [email protected]    | Bob    |
|   2    | [email protected]    | Joe    |
|   3    | [email protected]    | Tim    |
--------------------------------

TABLE_scores

|--------|------------|-------------|--------|
| SRE_ID |   STU_ID   |  DATE       |  SCORE |
|--------|------------|-------------|--------|
|  91    | 2          | 2018-04-03  |  78    |
|  92    | 2          | 2018-04-06  |  89    |
|  93    | 3          | 2018-04-03  |  67    |
|  94    | 3          | 2018-04-06  |  72    |
|  95    | 3          | 2018-04-07  |  81    |
----------------------------------------------

Я пытаюсь выбрать данные из обеих таблиц, но у меня есть несколько требований. Мне нужно выбрать ученика, даже если у него нет оценок в таблице оценок. Мне также нужны только последние результаты.

Приведенный ниже запрос возвращает только тех учащихся, которые имеют оценку, а также дублирует, возвращает в общей сложности 5 строк (поскольку имеется пять оценок). Я хочу, чтобы запрос возвращал три строки (по одной для каждого учащегося) и их последнее значение оценки (или NULL, если у них нет оценки):

SELECT students.NAME, scores.SCORE FROM TABLE_students as students, TABLE_scores AS scores WHERE students.STU_ID = scores.STU_ID;

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

Спасибо!

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
228
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать коррелированный подзапрос:

SELECT *, 
 (SELECT score FROM TABLE_scores sc 
  WHERE sc.stu_id = s.stu_id ORDER BY DATE DESC LIMIT 1) AS score
FROM TABLE_students s

Это вариант вопроса , который часто встречается в Stack Overflow.

Я бы сделал это с помощью пары соединений:

SELECT s.NAME, c1.DATE, c1.SCORE
FROM students AS s
LEFT JOIN scores AS c1 ON c1.STU_ID = s.STU_ID
LEFT JOIN scores AS c2 ON c2.STU_ID = s.STU_ID 
  AND (c2.DATE > c1.DATE OR c2.DATE = c1.DATE AND c2.SRE_ID > c1.SRE_ID)
WHERE c2.STU_ID IS NULL;

Если c2.STU_ID имеет значение NULL, это означает, что LEFT JOIN не соответствует ни одной строке с более высокой датой (или большим SRE_ID в случае ничьей), чем строка в c1. Это означает, что строка в c1 должна быть самой последней, потому что более новой строки нет.

P.S .: Пожалуйста, изучите синтаксис JOIN и избегайте объединений в стиле запятых. JOIN является стандартом с 1992 года.

P.P.S .: Я удалил лишний префикс "TABLE_" из имен ваших таблиц. Вам не нужно использовать имя таблицы, чтобы напоминать себе, что это таблица! :-)

Другие вопросы по теме