Тестовая структура:
CREATE TABLE b (
id INT,
data TEXT
);
CREATE TABLE s (
id INT,
b_id INT,
time INT
);
INSERT INTO b VALUES (1, 2);
INSERT INTO b VALUES (2, 3);
INSERT INTO s VALUES (1, 1, 3);
INSERT INTO s VALUES (2, 1, 2);
INSERT INTO s VALUES (3, 1, 9);
INSERT INTO s VALUES (4, 2, 8);
INSERT INTO s VALUES (5, 2, 4);
INSERT INTO s VALUES (6, 2, 5);
Задача:
В один запрос, для каждого id из b получить из s значение с максимальным значением поля time
Ожидаемый вывод здесь:
+------+------+------+------+-----------+
| id | data | b_id | sid | time |
+------+------+------+------+-----------+
| 1 | 2 | 1 | 3 | 9 |
| 2 | 3 | 2 | 4 | 8 |
+------+------+------+------+-----------+
(имена столбцов не существенны. Пример приведен для упрощения понимая задачи)
Чего смог сам(ну, я пытался)
select b.id as bid, b.data, s.time, s.b_id from b b inner join s s on b.id=s.b_id order by s.time DESC;
+------+------+------+------+
| bid | data | time | b_id |
+------+------+------+------+
| 1 | 2 | 9 | 1 |
| 2 | 3 | 8 | 2 |
| 2 | 3 | 5 | 2 |
| 2 | 3 | 4 | 2 |
| 1 | 2 | 3 | 1 |
| 1 | 2 | 2 | 1 |
+------+------+------+------+
6 rows in set (0.00 sec)
ВАЖНО в субд ожидается включенный режим sql_mode=only_full_group_by
Ответ
SELECT b.*, (SELECT MAX(s.`time`) FROM s WHERE s.`b_id` = b.`id` ) AS max_s_time FROM b
Комментариев нет:
Отправить комментарий