Найти min и max по каждой записи

vipTelnet
Дата: 18.01.2013 14:36:09
Есть такая вот не хитрая
табличка
Нужно найти по каждому полю a,b,с
их максимальное и минимальное значение, желательно за один запрос пробую так
SELECT * , id =0 AS min, MAX(  `val` ) AS max
FROM  `test` 
GROUP BY  `text` 
UNION ALL 
SELECT * , MIN(  `val` ) AS min, id =0 AS max
FROM  `test` 
GROUP BY  `text` 
ORDER BY  `text` ASC ,  `val` ASC 


получаю следующий результат

т.е вроде как минимальное и максимальное значение находиться но почему то ни поле id ни поле text не соответствуют той строке где реально находиться минимальное или максимальное значение, а просто берется первое из данной группы, а уже пробывал и группировать по max или min , пишет ошибку и так пробывал
SELECT * , id =0 AS min, MAX(  `val` ) AS max
FROM  `test` 
GROUP BY  `text` HAVING `val`  =  MAX(  `val` )
UNION ALL 
SELECT * , MIN(  `val` ) AS min, id =0 AS max
FROM  `test` 
GROUP BY  `text` HAVING `val`  =  MIN(  `val` )
ORDER BY  `text` ASC ,  `val` ASC 


Получаю
Т.е только то поле которое встречается 1 раз
Помогите разобраться, что я делаю не так.
Akina
Дата: 18.01.2013 16:36:23
vipTelnet
минимальное и максимальное значение находиться но почему то ни поле id ни поле text не соответствуют той строке где реально находиться минимальное или максимальное значение, а просто берется первое из данной группы
То есть в точности как и написано в документации.
http://dev.mysql.com/doc/refman/5.5/en/group-by-extensions.html
MySQL extends the use of GROUP BY so that the select list can refer to nonaggregated columns not named in the GROUP BY clause. This means that the preceding query is legal in MySQL. You can use this feature to get better performance by avoiding unnecessary column sorting and grouping. However, this is useful primarily when all values in each nonaggregated column not named in the GROUP BY are the same for each group. The server is free to choose any value from each group, so unless they are the same, the values chosen are indeterminate. Furthermore, the selection of values from each group cannot be influenced by adding an ORDER BY clause. Sorting of the result set occurs after values have been chosen, and ORDER BY does not affect which values the server chooses.
A similar MySQL extension applies to the HAVING clause. In standard SQL, a query that includes a GROUP BY clause cannot refer to nonaggregated columns in the HAVING clause that are not named in the GROUP BY clause. A MySQL extension permits references to such columns to simplify calculations. This extension assumes that the nongrouped columns will have the same group-wise values. Otherwise, the result is indeterminate.
vipTelnet
Дата: 18.01.2013 17:07:05
Akina
Спасибо за ссылку на анг только она мне не помогла, а есть где нить тоже но на рус
vipTelnet
Дата: 18.01.2013 17:16:53
В итоге нужно получить
id text val
3 a 5.2
4 a 1.4
7 b 7,6
5 b 3.3
10 с 2
10 с 2
javajdbc
Дата: 18.01.2013 17:28:26
vipTelnet,

7543220
vipTelnet
Дата: 18.01.2013 19:09:05
SELECT
  min_table.id AS id,
  min_table.text AS text, 
  aggregate.min_val
FROM
  (SELECT
    min(val) AS min_val
  FROM test
    GROUP BY text) AS aggregate
LEFT JOIN test AS min_table
  ON min_table.val=aggregate.min_val
UNION ALL 
SELECT
  max_table.id AS id,
  max_table.text AS text,
  aggregate.max_val
FROM
  (SELECT
    max(val) AS max_val
  FROM test
    GROUP BY text) AS aggregate
LEFT JOIN test AS max_table
  ON max_table.val=aggregate.max_val
  ORDER BY  `text` ASC 


Вот так можно решить эту задачу, всем спасибо за помощь