#mysql #sql #join
Тестовая структура: 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
Ответы
Ответ 1
SELECT b.*, (SELECT MAX(s.`time`) FROM s WHERE s.`b_id` = b.`id` ) AS max_s_time FROM bОтвет 2
Используйте следующее выражение: SELECT b.id, MAX(s.time) AS time FROM b LEFT JOIN s ON b.id = s.b_id GROUP BY b.id
Комментариев нет:
Отправить комментарий