SQL Inner Join только одна строка на основе отфильтрованных записей

У меня есть следующие таблицы

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

идентификатор имя 1 Джон 2 Джек 3 Джордж

сочинение

идентификатор date_submitted ID пользователя project_id 1 2020-12-10 1 1 2 2020-05-01 2 2 3 2020-04-10 3 2

проект_фаза

идентификатор project_id дата фаза 1 1 2020-01-01 рано 2 1 2020-05-31 середина 3 1 2020-11-30 поздно 4 2 2020-01-01 рано 5 2 2020-03-31 середина 6 2 2020-04-30 поздно

1 Пользователь отправляет только 1 эссе в одном проекте и я хочу иметь комбинированную таблицу, которая показывает мне пользователя и этап, на котором было отправлено эссе.

Я пытаюсь получить запись с МАКСИМАЛЬНОЙ датой из project_phase, которая ниже date_submitted

Итак, используя приведенные выше данные, я хочу получить

пользователь date_submitted фаза Джон 2020-12-10 поздно Джек 2020-05-01 поздно Джордж 2020-04-10 середина

до сих пор я объединил таблицы с INNER JOIN, но следующий запрос возвращает повторяющиеся записи. Я также пробовал ROW_NUMBER() и MAX(), но я неправильно структурировал его, чтобы получить ответ, который я ищу.

SELECT
    U.name,
    E.date_submitted,
    P.phase
FROM
    essay E
INNER JOIN user U ON U.id = E.user_id
INNER JOIN project_phase P ON P.project_id = E.project_id and E.date <= P.date_submitted

Любая помощь приветствуется, спасибо.

Освоение архитектуры микросервисов с 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
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
0
305
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Я бы предложил коррелированный подзапрос:

SELECT U.name, E.date_submitted,
       (SELECT P.phase
        FROM project_phase P
        WHERE P.project_id = E.project_id AND
              P.date <= E.date_submitted 
        ORDER BY p.date DESC
        LIMIT 1
       ) as phase
FROM essay E JOIN
     user U
     ON U.id = E.user_id;

Кажется, все в порядке, за исключением: изменить строку WHERE на: WHERE P.project_id = E.project_id AND

Florent 13.12.2020 21:19

Это был быстрый ответ! Просто запустите несколько проверок примерно в 100 тыс. строк, и все будет выглядеть хорошо. Спасибо!!

Yiannis 13.12.2020 21:59

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