Присоединиться к таблице с последним значением, не работает - PullRequest
0 голосов
/ 18 июня 2019

Я пытаюсь присоединиться к таблице delivery с последним значением таблицы delivery_history. Для этого я написал следующий запрос, но он не сработал:

SELECT d.*
FROM delivery as d
LEFT JOIN 
     (SELECT * 
      FROM delivery_history 
      WHERE delivery_history.delivery_id = d.id 
      ORDER BY id DESC LIMIT 1) h ON d.id = h.delivery_id 
WHERE h.delivery_status = 'Pending' GROUP BY d.id

стол поставки

id | name  
1  | John

Таблица доставки_истории

id | delivery_id | delivery_status 
1  | 1           | Pending
2  | 1           | Invoiced

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

id | name | delivery_status 
1  | John | Invoiced

В чем проблема с моим запросом?

Ответы [ 2 ]

2 голосов
/ 18 июня 2019

Используйте логику следующим образом:

SELECT d.*
FROM delivery d JOIN
     delivery_history dh
     ON dh.delivery_id = d.id JOIN
     (SELECT dh.delivery_id, MAX(dh.id) as max_id
      FROM delivery_history dh
      GROUP BY dh.delivery_id
     ) ddh
     ON ddh.delivery_id = dh.delivery_id AND ddh.max_id = dh.id
WHERE dh.delivery_status = 'Pending';

Я изменил LEFT JOIN на внутренние объединения, потому что вам требуется соответствие для условия WHERE.

РЕДАКТИРОВАТЬ:

Если вам нужен только самый последний статус, возможно, более эффективно использовать коррелированный подзапрос:

select d.*,
       (select dh.status
        from delivery_history dh
        where dh.delivery_id = d.id
        order by dh.id desc
        limit 1
       ) as latest_status
from delivery d
having latest_status = 'Pending';
0 голосов
/ 18 июня 2019

Используйте max

SELECT d.id, max(h.id)
FROM delivery as d
LEFT JOIN delivery_history h ON h.delivery_id = d.id
WHERE h.delivery_status = 'Pending' 
GROUP BY d.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...