При извлечении последней строки из дочерней таблицы MySQL, возвращающей разные результаты для подзапроса GROUP BY и JOIN - PullRequest
0 голосов
/ 09 июля 2019

У меня есть две таблицы в отношениях один-ко-многим.Строка в родительской таблице (с именем Inquiry) может иметь ноль или N строк дочерней таблицы (с именем InqNotes).

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

A:

select i.*, n.LastUpdated as NotesTs, n.Notes, n.LoginId as NotesBy 
from MYDB.Inquiries i
LEFT outer join MYDB.InqNotes n on n.InquiryId=i.Id 
and n.Id = (select max(n2.Id) from MYDB.InqNotes n2 where n2.InquiryId=i.Id);

B:

select max(n.LastUpdated) as NotesTs, n.Notes, n.LoginId as NotesBy, 
i.InquiryNo, i.Status, i.InquiryType, i.ClientName, i.PhoneNo, i.Id
from MYDB.Inquiries i
LEFT outer join MYDB.InqNotes n on n.InquiryId=i.Id 
group by n.LastUpdated, n.Notes, n.LoginId, i.InquiryNo, i.Status, i.InquiryType, i.ClientName, i.PhoneNo, i.Id

Я ожидал, что два вышеупомянутых запроса вернут один и тот же набор записей.Каким-то образом они возвращают разные результаты.Запрос в A возвращает несколько записей меньше, чем то, что возвращает B (т. Е. Группа в каждом конкретном случае).Может быть, я пропускаю что-то ужасно простое, но я не могу понять, почему такое поведение запросов.Буду очень признателен за любые указания на то, что я делаю / ожидаю неправильно с этими запросами.

1 Ответ

0 голосов
/ 09 июля 2019

Очень упрощенная версия ваших данных: -

drop table if exists inquiries,inqnotes;

create table inquiries
(id int);

create table inqnotes
(id int,inquiryid int,lastupdated date);

insert into inquiries values
(1),(2);

insert into inqnotes values
(1,1,'2019-01-01'),(2,1,'2019-02-01');

select i.*, n.LastUpdated as NotesTs 
from Inquiries i
LEFT outer join InqNotes n on n.InquiryId=i.Id 
and n.Id = (select max(n2.Id) from InqNotes n2 where n2.InquiryId=i.Id);

+------+------------+
| id   | NotesTs    |
+------+------------+
|    1 | 2019-02-01 |
|    2 | NULL       |
+------+------------+
2 rows in set (0.00 sec)

select max(n.LastUpdated) as NotesTs, i.Id
from Inquiries i
LEFT outer join InqNotes n on n.InquiryId=i.Id 
group by n.lastupdated, i.Id;

+------------+------+
| NotesTs    | Id   |
+------------+------+
| NULL       |    2 |
| 2019-01-01 |    1 |
| 2019-02-01 |    1 |
+------------+------+
3 rows in set (0.00 sec)

Что явно неверно.И это неправильно из-за группировки на n.lastupdated.

Попробуйте удалить эту группировку

select max(n.LastUpdated) as NotesTs, i.Id
from Inquiries i
LEFT outer join InqNotes n on n.InquiryId=i.Id 
group by i.Id;
+------------+------+
| NotesTs    | Id   |
+------------+------+
| 2019-02-01 |    1 |
| NULL       |    2 |
+------------+------+
2 rows in set (0.00 sec)
...