Получить последнюю запись из объединенной таблицы

#mysql #sql

Вопрос:

У меня есть две таблицы ДОКУМЕНТОВ и ПОДПИСЕЙ, как показано ниже

 DOCUMENTS
doc_id    doc_name
1         Contract
2         Lead
3         Invoice 1
4         Invoice 2
5         Payment 123

SIGNATURES
sig_id    sig_doc_id     signature_name
1         1              Paul
2         2              Mark
3         1              Chew
4         2              Paul
5         3              John
6         3              Derek
7         3              Silvan
8         5              Roden
 

И я пытаюсь узнать фамилию и имя.

 EXPECTED OUTPUT
doc_id      doc_name      signature_name
1           Contract      Chew
2           Lead          Paul
3           Invoice 1     Silvan
4           Invoice 2             < empty because we not have signature
5           Payment 123   Roden
 

У меня есть SQL-скрипка с базой данных и запросом, но при запуске поиска запись не найдена.

http://sqlfiddle.com/#!9/b98474/3

Вот мой вопрос

 SELECT docs.*, sign.*
FROM cnt_man_docs docs
INNER JOIN cnt_man_doc_signatures sign ON docs.cnt_man_doc_id = sign.cnt_man_doc_signature_doc_id
WHERE sign.cnt_man_doc_signature_id = 
(SELECT MAX(cnt_man_doc_signature_id)
FROM cnt_man_doc_signatures
WHERE sign.cnt_man_doc_signature_id = docs.cnt_man_doc_id)
 

Комментарии:

1. Последний по какому заказу?

2. Я могу заказать по doc_id ?

Ответ №1:

Простой метод-это коррелированный подзапрос:

 select d.*,
       (select s.signature_name
        from signatures s
        where s.sig_doc_id = d.doc_id
        order by s.sig_id desc
        limit 1
       ) as signature_name
from documents d;
 

С индексом signatures(doc_id, sig_id desc, signature_name) это, вероятно, также самый быстрый метод.