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

1. SD (16.07.2010 / 01:33)
Есть запрос
SELECT COUNT(`id`) AS `cnt`, `name`, `score` FROM `table` WHERE `name` = 'aaa' GROUP BY `name` ORDER BY `score` LIMIT 1
и в общем мне нужно, чтобы этот запрос вывел наибольший score, но выводит он вообще как-то странно... Как быть, подскажите.

2. Олег (16.07.2010 / 02:11)
Что значит странно? LIMIT 1 зачем здесь?

3. SD (16.07.2010 / 02:18)
лимит не нужен, он и так выводит. Странно - с кол-вом записей изменяется и выбранное поле 'score'

4. Олег (16.07.2010 / 02:20)
Если тебе нужно максимальное значение, то используй MAX, если подсчитать кол-во, то COUNT

5. Олег (16.07.2010 / 02:21)
А вообще приложи небольшой дамп базы со структурой и напиши какой результат ты в итоге хочешь получить

6. SD (16.07.2010 / 02:39)
4. Aligan, а я ORDER BY для чего использую по твоему в выводе одного результата?

7. Олег (16.07.2010 / 02:42)
Emissar, именно с LIMIT 1 - ДА.

8. Олег (16.07.2010 / 02:44)
Да и группировка неправильная. Следует по id группировать, как я понял это primary

9. SD (16.07.2010 / 02:51)
я групирую по нейму как по опознавательному идентификатору. ид в данном случае первичный ключ. вопрос исчерпан

10. Олег (16.07.2010 / 02:56)
Ну тогда в таком случае за разъяснениями к EXPLAIN.
name это что-ли ключ к связной таблице?

11. SD (16.07.2010 / 03:43)
Нет. Смотри. Мне нужно вывести из таблицы запись с определнным 'name'(это поле у каждого юзера свое - записей с одинаковым нейм может быть в таблице несколько), причем одну. Соответственно, когда я группирую по 'name' - у меня будет только один результат - хоть с LIMIT 1, хоть без него.
И мне нужен именно тот результат, в котором поле 'score' - наибольшее. Поэтому и пытаюсь отсортировать по этому полю в порядке убывания. А mysql сортирует в данном случае "от балды". Т.е. если есть у меня, например, записи со 'score' 1, 2, 3, 4, 5, то они при добавлении/удалении записи сортируются явно не по убыванию.
Насчет MAX('score') - не катит, т.к. максимальное ЭТО поле то он выбирает, а остальные(например `id`) берет вообще не из этой строки, где максимальное score.
Как такое организовать?
С GROUP BY, как я понял, сортировочка тупит...

12. SD (16.07.2010 / 03:48)
вот пример таблицы. Из нее, например надо получить результат вида:
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');


13. SD (16.07.2010 / 03:55)
дополнение к посту #11: первая запись на выходе - не с максимальным 'score', а та, которая на первом месте в таблице. Т.е. 'score' берется с нее.

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

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

16. SD (16.07.2010 / 10:41)
15. Aligan, если есть алиасы - группировка обязательна. этот запрос не катит.

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


18. Олег (16.07.2010 / 12:00)
Хотя нет, подсчет вернет 1

19. SD (16.07.2010 / 12:03)
тогда так:
SELECT `id`, `name`,  count(*) AS cnt, MAX(`score`) AS max  FROM `gg` WHERE `name` = 'vasya'
GROUP BY `name` 
order by max desc
вроде правильно выводит пока. Там посмотрим. спасибо.

20. Олег (16.07.2010 / 12:04)
За исключением того что cnt вернет 1 всегда. В данном случае поле cnt обязательно?

21. Олег (16.07.2010 / 12:10)
Вот правильный запрос
SELECT 
	`id`, 
	`name`,  
	MAX(`score`) AS max ,
	(select count(*) from gg where  name = 'vasya') AS cnt
FROM 
	`gg` 
WHERE `name` = 'vasya' 
GROUP BY id order by max desc limit 1


22. SD (16.07.2010 / 14:47)
20. Aligan, не 1, а 6 он возвращает. я в 19 посте подредактировал немного твой запрос.
21. Aligan, мне подзапросы не нужныsmile

URL: https://visavi.net/topics/11597