Вывод MYSQLI с INNER JOIN и GROUP BY + ORDER. Как?
Есть table_one:
ID | PARAM | PARAM_2
1 | p1 | p2
2 | p3 | p4
3 | p5 | p6
И есть вторая таблица, которая имеет структуру примерно такую:
C_ID | LOCAT | DATE
1 | AN | 2020-05-05
2 | TZ | 2020-03-05
3 | KA | 2020-12-25
3 | AN | 2020-05-25
1 | KL | 2020-05-15
1 | KL | 2020-12-15
Во второй таблице ID могут повторяться, с разными датами.
Нужно сопоставить первую и вторую таблицу так, что бы получилось следующее:
ID | DATE | LOCAT
1 | 2020-12-15 | KL // Последний раз 1 ид был записан 2020-12-15 с LOCAT KL.
2 | 2020-03-05 | TZ // ID 2 был записан один раз.
3 | 2020-12-25 | KA // Последняя запись была сделана в эту дату.
Сейчас получается сделать только с самой старой датой (при GROUP BY ID)
Вот примерный код:
SELECT
c.id,
c.param,
c.param2,
d.c_id,
d.locat,
d.date
FROM
`table_once` AS c
JOIN `table2` AS d ON c.id = d.c_id
GROUP BY id
ORDER BY id
Пробовал MAX(d.date) AS lastdate - не помогает. Получается, он
группирует по ID, но выводит дату самую старую.
Ответы (2 шт):
Автор решения: Darevill
→ Ссылка
SELECT * FROM (
SELECT c.id, c.param, c.param2, d.c_id, d.locat, d.date
FROM table_once c
JOIN table2 AS d ON c.id = d.c_id
ORDER BY d.date DESC
) t
GROUP BY id
ORDER BY id ASC
Автор решения: Ainar-G
→ Ссылка
ЕМНИП, это классический вариант с JOIN таблицы на саму
себя:
SELECT t_1.id
, t_1.param
, t_1.param_2
, t_2.locat
, t_2_max.date
FROM t_1
INNER JOIN (
SELECT t_1_id, MAX(date) AS date
FROM t_2
GROUP BY t_1_id
) AS t_2_max
ON t_1.id = t_2_max.t_1_id
INNER JOIN t_2
ON t_1.id = t_2.t_1_id
AND t_2_max.date = t_2.date
ORDER BY t_1.id
;
DB-Fiddle: https://www.db-fiddle.com/f/iaxGWWQ8nLD3g9qRivXxF4/0.