[MySQL] Сортировка перед GROUP BY

kruzer25

Пусть есть таблица с полями `a`,`b` (может повторяться) и `text`
В запросе типа SELECT `text` FROM `table` GROUP BY `b` - как можно получить, например, тот `text`, для которого `a` (при данном `b`) минимально?
То есть, что-то типа SELECT `text` FROM `table` ORDER BY `a` ASC GROUP BY `b`?
В мануале ничего не нашёл:
12.10.3. GROUP BY with Hidden Fields
MySQL extends the use of GROUP BY so that you can use columns or calculations in the SELECT list that do not appear in the GROUP BY clause. This stands for “any possible value for this group.” You can use this to get better performance by avoiding sorting and grouping on unnecessary items. For example, you do not need to group on customer.name in the following query:
SELECT order.custid, customer.name, MAX(payments)
  FROM order,customer
  WHERE order.custid = customer.custid
  GROUP BY order.custid;
In standard SQL, you would have to add customer.name to the GROUP BY clause. In MySQL, the name is redundant if you do not run with the ONLY_FULL_GROUP_BY SQL mode enabled.
Do not use this feature if the columns you omit from the GROUP BY part are not unique in the group! You get unpredictable results.
In some cases, you can use MIN and MAX to obtain a specific column value even if it isn't unique. The following gives the value of column from the row containing the smallest value in the sort column:
SUBSTR(MIN(CONCAT(RPAD(sort,6,' 'column7)
See Section 3.6.4, “The Rows Holding the Group-wise Maximum of a Certain Field”.
Note that if you are trying to follow standard SQL, you can't use expressions in GROUP BY clauses. You can work around this limitation by using an alias for the expression:
SELECT id,FLOOR(value/100) AS val
  FROM tbl_name
  GROUP BY id, val;
MySQL does allow expressions in GROUP BY clauses. For example:
SELECT id,FLOOR(value/100)
  FROM tbl_name
  GROUP BY id, FLOOR(value/100);
Неужели это невозможно?

6yrop

Неужели это невозможно?
это элементароно . Почему ты мыслишь всегда одним запросом? В реляционной модели есть замечательное свойство -- замкнутости

oleg701

SELECT `text` FROM `table` GROUP BY `b`
На мой взгляд, это бред какой-то.
Что ты надеешься получить этим запросом?
По-моему, уже обсуждалось, что в SELECT можно указывать только те поля, которые присутствуют в GROUP BY.
Если же нужно
получить, например, тот `text`, для которого `a` (при данном `b`) минимально
то это можно сделать так:
select t1.b, t1.text from table as t1
where a = (
select MIN(t2.a) from table as t2
where t2.b=t1.b)

Flack_bfsp

По-моему, уже обсуждалось, что в SELECT можно указывать только те поля, которые присутствуют в GROUP BY.

Это в стандарте. А в треде обсуждается MySQL. В нём это можно.

oleg701

Возможно.
Просто интересно, что возвращает такой запрос в текстовом поле.
Первое значение в выборке?
А, понял. Просто не прочитал хелп в первом посте.
Так там ясно написано - не пользуйтесь этой фишкой для неуникальных значений.

Flack_bfsp

Да. Вот для этого человек и хочет сортировать перед GROUP BY.

kruzer25

Почему ты мыслишь всегда одним запросом?
Для упрощения кода и повышения его понятности + увеличения скорости.

kruzer25

то это можно сделать так:
select t1.b, t1.text from table as t1
where a = (
select MIN(t2.a) from table as t2
where t2.b=t1.b)
Ладно, усложню задачу - а если надо упорядочить по необратимой функции от `a`?

oleg701

Ну напишешь в двух местах вместо а - НЕОБРАТИМАЯ_ФУНКЦИЯ(а)
Если конечно эта функция дает разные значения для разных а.

kruzer25

Да, функция может быть и не инъективной, конечно...

oleg701

SUBSTRING что ли?
Ты лучше скажи, что тебе нужно, а не ставь теоретические задачки.

kruzer25

FIND_IN_SET, например - куча значений переходит в 0.
В общем-то, конкретные задачи я уже решил, просто интересно, можноли сделать сабж...
Оставить комментарий
Имя или ник:
Комментарий: