Запрос с сортировкой по количеству совпадений

willwin

Guest
Запрос с сортировкой по количеству совпадений

Всем привет!

Делал я как-то давно счётчик посещений с подробной статистикой. Там у меня каждое посещение логируется в базе данных, а статистика уже составляется на основе этих логов. Сейчас счётчик стал довольно активно использоваться, и статистика стала тормозить. Нужно оптимизировать запросы к БД. И вот главная проблема: я не знаю, как составить такой запрос, который достанет из таблицы все записи, удовлетворяющие определённому критерию И сразу сгруппирует их по количеству строк, в которых какой-то столбец имеет какое-то определённое одинаковое значние и вернёт мне количество этих самых строк. До этого я сначала запрашивал просто все записи, у которых разное поле, например, referer_ip (использовал GROUP BY referer_ip), а потом в цикле для каждой полученной записи вычислял, сколько раз встречаеются строки с таким referer_ip. Потом ещё отдельно сортировал это, сохранив всё в массив. В результате сейчас всё жутко тормозит Надеюсь, понятно объяснил. Буду благодарен за любую помощь.
 

alexhemp

Новичок
Собственно совет один - изучайте SQL, делайте индексы, пишите запросы.

если я правильно понял задачу, то есть таблица, вроде
ID, дата-время, referrer_ip, URL

нужно посчитать сколько запрошено по каждому REFERRER_IP?

если да, то нужен индекс по этому полю (надеюсь оно integer?)

и запрос что-то вроде SELECT referrer_ip, count(id) FROM table GROUP BY referrer_id

ну и WHERE наложите, ORDER и HAVING если нужно
 

willwin

Guest
alexhemp
спасибо за совет, изучать обязательно буду, но сейчас нужно срочно переделать, и я решил, что дружелюбный форум - лучший выход :)

А как может поле IP был INTEGER? Там же точки :) ID - integer, конечно. Вы, кажется, путаете - то пишете referer_ip, то referer_id :)
 

Кром

Новичок
Убать индекс, добавить индекс, все равно фигня получится.

>изучать обязательно буду, но сейчас нужно срочно переделать,

willwin, ты что правда такой наивный? Ты действительно думаешь, что можно сначала что-то сделать, а потом только узнать - как это сделать?
В таком случае твои потуги со счетчиком совершенно бессмысленны.
 

willwin

Guest
Кром
нет, я не наивный, и я не начинающий разработчик. Я понимаю, что делаю, и нет такого, что делаю, как скажут, буквально всё повторяя. Я задал один конкретный вопрос по одному конкретному запросу, а не спросил что-нибудь типа "а как мне сделать счётчик?". У меня продумана вся схема работы и структура базы. Не надо меня опускать и недооценивать. И спасибо за гостеприимность.
 

Сенсей

Новичок
Добавь в запрос count(referer_ip) as num_ref

и в конце запроса order by num_ref DESC

Вроде так
 

Кром

Новичок
Да, willwin, ты прав. Ты не начинающий разработчик. Тебе до этого еще очень далеко.

А пока я тебе расскажу, как ведет себя начинающий разработчик.
Приходит начинающий разработчик на форум и спрашивает, - как, мол, сделать?
А ему говорят - индексы.
Он идет на сайт mysql.com, находит документацию, раздел "индексы" и читает. Потому что это ему нужно, а не другим.
Потом ему говорят, - попробуй такой запрос.
А он смотрит, в запросе ошибки. Смотрит и думает, ну конечно, какой же я дурак. Люди даже и не знают структру моей таблицы! Им же структуру нужно показать! Может она все таки не так уж продумана и не такая уж схематичная как мне кажется.
А ему говорят, - структура то, кривая. Переделай. И схему свою, тоже.
Смотрит он тогда на свою схему, чешет репу и думает, - да, наверное не такой уж я и разработчик. Это потому что у него самокритика есть.
А у тебя ничего нет. Самомнение только большое.
 

willwin

Guest
Кром
у вас правильно написано в подписи "врач".. лечите..
только больше в переносном смысле, чем в прямом..

Нельзя так с первого поста делать выводы о человеке и вешать ярлык, насколько бы там умным и опытным вы себя ни считали.
 

alexhemp

Новичок
willwin

На будущее - как можно работать с ip адресами - не зная что они суть - 32 битные числа? И что точки - только для удобства ЗАПИСИ человеком.

И Кром верно все говорит. Вам нужно не срочно писать, а срочно изучать. Без изучения вы такого "срочно" напишете...
 
Сверху