Страницы

Поиск по вопросам

четверг, 5 декабря 2019 г.

MySQL: получить наибольше значение из каждой группы

#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

Комментариев нет:

Отправить комментарий