Удалите строку max / min с трюком левого соединения для группы, когда группа находится на другом столе - PullRequest
0 голосов
/ 25 мая 2018

Я пытаюсь применить левый трюк к таблицам ниже.Этот трюк хорошо задокументирован здесь и включает в себя левое самостоятельное объединение при сравнении поля, для которого требуется минимальное или максимальное значение, затем левое объединение дает нулевое значение для строки минимального или максимального значения, затем вы выбираете этонулевое совпадениеОднако у меня есть проблема, решающая эту проблему, когда групповое поле находится на другом столе.Приведенные ниже таблицы объединены сообщением messjoin.fk_mess = message.id, и я включил мою лучшую попытку выполнить запрос.В настоящее время не удается выполнить группировку.

Вот пример fiddle , когда группа находится в той же таблице, что и поле min / max

CREATE TABLE messages(`id` int, `when` date);

CREATE TABLE messjoin(`grp` int, `fk_mess` int);

INSERT INTO messages
    (`id`, `when`)
VALUES
    (1,'2000-08-14'),
    (2,'2000-08-15'),
    (3,'2000-08-16'),
    (4,'2000-08-17'),
    (5,'2000-08-18'),
    (6,'2000-08-19');

INSERT INTO messjoin
    (`grp`, `fk_mess`)
VALUES
    (1, 1),
    (1, 2),
    (1, 3),
    (2, 4),
    (2, 5),
    (2, 6);


select p1.*, m1.*, m2.*
      from messjoin p1 
inner join messages m1 on p1.fk_mess = m1.id
inner join messjoin p2 on p2.fk_mess = m1.id
left  join messages m2 on p2.grp = p1.grp and m1.when < m2.when
where m2.id is null;
+------+---------+------+------------+------+------+
| grp  | fk_mess | id   | when       | id   | when |
+------+---------+------+------------+------+------+
|    2 |       6 |    6 | 2000-08-19 | NULL | NULL |
+------+---------+------+------------+------+------+

ЧтоЯ хочу, чтобы получить максимальную дату для каждой группы .grp, например, так:

+------+---------+------+------------+------+------+
| grp  | fk_mess | id   | when       | id   | when |
+------+---------+------+------------+------+------+
|    1 |       3 |    3 | 2000-08-16 | NULL | NULL |
|    2 |       6 |    6 | 2000-08-19 | NULL | NULL |
+------+---------+------+------------+------+------+

Я не хочу агрегатную функцию или решение подзапроса!И это в MySQL Спасибо!

1 Ответ

0 голосов
/ 25 мая 2018

Чтобы сделать эту работу, вам нужно LEFT JOIN JOIN двух таблиц друг к другу:

SELECT p1.*, m1.*, m2.*
FROM (messparent p1 JOIN messages m1 ON p1.fk_mess = m1.id)
LEFT JOIN
(messparent p2 JOIN messages m2 ON p2.fk_mess = m2.id)
ON m2.when > m1.when AND p2.grp = p1.grp
WHERE m2.id IS NULL

Вывод:

grp fk_mess id  when        id  when
1   3       3   2000-08-16  (null)  (null)
2   6       6   2000-08-19  (null)  (null)

SQLFiddle .

...