Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MySQL > проблема подсчета числа результатов запроса


Автор: Vigoroso 6.5.2007, 11:50
в таком виде оно работает:
Код

select DATE_FORMAT(min(visitDate), '%Y %m %d') as `date` from page_visit;

но как только я ставлю count
Код

select count(DATE_FORMAT(min(visitDate), '%Y %m %d')) as `date` from page_visit;

пишет что не может осуществить такую группировку
ERROR 1111 (HY000): Invalid use of group function

Автор: Kesh 6.5.2007, 13:43
Код
select count(*) from `page_visit`
where `visitDate` = (select min(`visitDate`) from `page_visit`)


Добавлено через 1 минуту и 58 секунд
Код

SELECT count(*) FROM `page_visit` group by `visitDate` asc limit 1;


Добавлено через 7 минут и 54 секунды
На 5000 записях у меня первое работает немного быстрее...
~0,023 сек против ~0,025 сек

Автор: Glip 6.5.2007, 13:53
Код

select DATE_FORMAT(min(visitDate), '%Y %m %d') as `date` from page_visit;

min(visitDate) разве не одну строку возвращает? 

Автор: Vigoroso 6.5.2007, 14:37
Цитата(Glip @ 6.5.2007,  13:53)
Код

select DATE_FORMAT(min(visitDate), '%Y %m %d') as `date` from page_visit;

min(visitDate) разве не одну строку возвращает?

возвращает одну, но я не могу понять, почему оно не хочет именно эту единицу мне показывать, мне нужно получить количество, потому что далее пойдет отбор по сессиям

Автор: Kesh 6.5.2007, 14:41
А чем мое не подходит?

Автор: Vigoroso 6.5.2007, 14:53
я так думал сделать, и скорее всего так и реализую, я просто не могу понять, почему не работает простой каунт??? ведь ничего фантастического я вроде не написал =\

Автор: Kesh 6.5.2007, 18:22
Я кучу вариантов перепробовал...
Сочетание count(min()) никак не работает... :(

Автор: Vigoroso 6.5.2007, 21:36
просто интересно, может у кого-то есть этому объяснение?

Автор: skyboy 6.5.2007, 22:16
Цитата(Vigoroso @  6.5.2007,  20:36 Найти цитируемый пост)
просто интересно, может у кого-то есть этому объяснение? 

группировка результатов агрегирующей функции? а у тебя "DATE_FORMAT(min(visitDate), '%Y %m %d')" в секции group by есть?(правда, не в курсе - можно ли пихать результаты агрегации в новую агрегацию) Если нету  - тогда ты просишь сгруппировать данные и сгруппировать результаты группировки без явных к тому указаний.

Автор: Vigoroso 6.5.2007, 22:44
то есть что-то типа двойной группировки?

Добавлено через 59 секунд
как сделать так, чтобы оно сработало?

Автор: skyboy 6.5.2007, 23:44
Vigoroso, попробуй добавить "GROUP BY visitDate, min(visitDate)".
 Скорее всего, не сработает и количество строк придется брать на стороне клиента. Или делать подзапрос.

Автор: Vigoroso 7.5.2007, 21:39
Цитата(skyboy @ 6.5.2007,  23:44)
Vigoroso, попробуй добавить "GROUP BY visitDate, min(visitDate)".
 Скорее всего, не сработает и количество строк придется брать на стороне клиента. Или делать подзапрос.

подзапросом реализовал, как вариант можно использовать "having" но почему-то у меня при этом терялись записи

Автор: skyboy 7.5.2007, 22:08
Цитата(Vigoroso @  7.5.2007,  20:39 Найти цитируемый пост)
"having"

это же фильтрация(как WHERE), a не группировка...

Автор: Ignat 8.5.2007, 09:34
А так?

Код

SELECT SQL_CALC_FOUND_ROWS DATE_FORMAT(min(visitDate), '%Y %m %d') as `date` from page_visit;
SELECT FOUND_ROWS();


Второй запрос должен вернуть количество строк возвращаемых запросом.

Автор: muzer 9.5.2007, 02:07
Цитата(Vigoroso @  6.5.2007,  12:50 Найти цитируемый пост)
но как только я ставлю count
Код

select count(DATE_FORMAT(min(visitDate), '%Y %m %d')) as `date` from page_visit;


пишет что не может осуществить такую группировку

А вы что посчитать-то пытаетесь??? 
Смотрите, что вы написали: "уважаемый mysql, вычисли мне, пожалуйста, минимальное значение поля visitDate в таблице page_visit, преобразуй его в заданный мной формат, а потом скажи, сколько не NULL значений ты вычислил". Так по определению минимальная дата может быть только одна, если строки есть, или ноль если строк в таблице нет.

Если вам нужно кол-во строк с минимальной датой, то это будет совершенно другой запрос. И почти обязательно с подзапросом.
Например 
Код

SELECT COUNT(*) FROM page_visit INNER JOIN (SELECT MIN(visitDate) FROM page_visit) tmp USING(visitDate);

Или
Код

SELECT COUNT(*) FROM page_visit WHERE visitDate = (SELECT MIN(visitDate) FROM page_visit);

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)