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, мне подзапросы не нужны
URL:
https://visavi.net/topics/11597