GROUP BY и сортировка

Печать RSS
347

S
Автор
Землянин
0
Нет. Смотри. Мне нужно вывести из таблицы запись с определнным 'name'(это поле у каждого юзера свое - записей с одинаковым нейм может быть в таблице несколько), причем одну. Соответственно, когда я группирую по 'name' - у меня будет только один результат - хоть с LIMIT 1, хоть без него.
И мне нужен именно тот результат, в котором поле 'score' - наибольшее. Поэтому и пытаюсь отсортировать по этому полю в порядке убывания. А mysql сортирует в данном случае "от балды". Т.е. если есть у меня, например, записи со 'score' 1, 2, 3, 4, 5, то они при добавлении/удалении записи сортируются явно не по убыванию.
Насчет MAX('score') - не катит, т.к. максимальное ЭТО поле то он выбирает, а остальные(например `id`) берет вообще не из этой строки, где максимальное score.
Как такое организовать?
С GROUP BY, как я понял, сортировочка тупит...
Изменил: SD (16.07.2010 / 03:51)
S
Автор
Землянин
0
вот пример таблицы. Из нее, например надо получить результат вида:
id - 6
cnt - 6
name - vasya
score - 6
CREATE TABLE `gg` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(64) NOT NULL,
  `score` varchar(64) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=7 ;

-- 
-- Дамп данных таблицы `gg`
-- 

INSERT INTO `gg` VALUES (1, 'vasya', '1');
INSERT INTO `gg` VALUES (2, 'vasya', '2');
INSERT INTO `gg` VALUES (3, 'vasya', '3');
INSERT INTO `gg` VALUES (4, 'vasya', '4');
INSERT INTO `gg` VALUES (5, 'vasya', '5');
INSERT INTO `gg` VALUES (6, 'vasya', '6');
Изменил: SD (16.07.2010 / 03:50)
S
Автор
Землянин
0
дополнение к посту #11: первая запись на выходе - не с максимальным 'score', а та, которая на первом месте в таблице. Т.е. 'score' берется с нее.
О

Землянин
0
На поле name добавь индекс, иначе при больших объемов дольше будет выполнятся запрос.
И вообще лучше вместо name хранить id пользователя
Изменил: Олег (16.07.2010 / 04:38)
О

Землянин
0
Одним запросом не получится. Когда агрегаты смешиваются с столбцами, выполнение запроса неоднозначано.
Первый запрос можно совершить так
SELECT `id`, `name`,  count(*) AS cnt, MAX(`score`) AS max  FROM `gg` WHERE `name` = 'vasya'  
Ну а далее чтобы получить id, составить второй запрос тебе не проблема
S
Автор
Землянин
0
15. Aligan, если есть алиасы - группировка обязательна. этот запрос не катит.
О

Землянин
0
Тогда так
SELECT `id`, `name`,  count(*) AS cnt, MAX(`score`) AS max  FROM `gg` WHERE `name` = 'vasya'
GROUP BY id
order by max desc limit 1
Изменил: Олег (16.07.2010 / 11:59)
О

Землянин
0
Хотя нет, подсчет вернет 1
S
Автор
Землянин
0
тогда так:
SELECT `id`, `name`,  count(*) AS cnt, MAX(`score`) AS max  FROM `gg` WHERE `name` = 'vasya'
GROUP BY `name` 
order by max desc
вроде правильно выводит пока. Там посмотрим. спасибо.
О

Землянин
0
За исключением того что cnt вернет 1 всегда. В данном случае поле cnt обязательно?
Стикеры / Теги / Правила / Топ тем / Топ постов / Поиск