@v7resspect

Как сделать выборку строк с минимальным и максимальным значениями столбцов из одной таблицы?

Здравствуйте. Есть такая таблица в БД:
name, code, city, int1, int2

Нужно сделать следующую выборку: выбрать строки со значением city, группировать по code, найти максимальное значение int1 и минимальное значение int2. Но при этом, чтобы бралось name для максимального int и минимального int2. Чтобы можно было сделать вот такой вывод:

city1:
code1: имя с максимальным int1, значение int1, имя с максимальным int2, значение int2
code2: имя с максимальным int1, значение int1, имя с максимальным int2, значение int2
code3: имя с максимальным int1, значение int1, имя с максимальным int2, значение int2

Пробовал реализовать так:
SELECT t.name as t_name, max(t.int1) as int1, t.code, t2.name as t2_name, min(t2.int2) as int2 FROM table t LEFT JOIN table t2 ON t.code = t2.code WHERE t.city = '$city' AND t2.city = '$city' GROUP BY t.code

Всё работает, но name для максимального значения int2 берется с name для int1. Что не так? Как реализовать?
  • Вопрос задан
  • 224 просмотра
Решения вопроса 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Поля, не включённые в GROUP BY или аггрегатные функции (t.name и t2.name) берутся из первой попавшейся строки. Тут нужен сложный JOIN
SELECT `t1`.`code`, `t1`.`name`, `t1`.`max_int1`, `t2`.`name`, `t2`.`max_int2`
  FROM (
    SELECT `t`.`name` AS `name`, `t`.`code` AS `code`, `t`.`int1` AS `max_int1`
      FROM (
        SELECT `code`, MAX(`int1`) AS `int1` 
          FROM `table` WHERE `city`= :city GROUP BY `code`
      ) AS `m`
      JOIN `table` AS `t` ON `t`.`city` = :city AND `t`.`code` = `m`.`code` 
        AND `t`.`int1` = `m`.`int1`
  ) AS `t1`
  JOIN (
    SELECT `t`.`name` AS `name`, `t`.`code` AS `code`, `t`.`int2` AS `max_int2`
      FROM (
        SELECT `code`, MAX(`int2`) AS `int2` 
          FROM `table` WHERE `city`= :city GROUP BY `code`
      ) AS `m`
      JOIN `table` AS `t` ON `t`.`city` = :city AND `t`.`code` = `m`.`code` 
        AND `t`.`int2` = `m`.`int2`
  ) AS `t2` ON `t1`.`code` = `t2`.`code`
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@amfetamine
MIN() и MAX() не катит?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы