MySQL + PHPДобрый вечер. Пишу систему рейтинг TOP 100.
Данный запрос используется при просмотре списка сайтов (TOP 100) и при просмотре TOP 100 по категории(ям).Структура такая -
domains[id,...] - сами сайты.
main[id,sid,ip....] - для каждого нового пользователя, заходящего на сайт, в эту таблицу вставляется 1 запись. т.е. Хосты. (Тут ещё хранится Разр. экрана,и др. текстовые параметры).
session[id,statid,sid], куда пишется каждый переход пользователя по сайту. statid = main.id (Хиты)
domainth[id,theme_id,domain_id] - таблица тем. сами темы в таблице themes, но она не в данном запросе не исп.Индексы все возможные сделал на все поля (id,sid,id+sid,....) Временно, понимаю что криво, позже уберу половину, но врятли из за этого.
sid - ид сайта (domains.id)
$tids - ID тематик, через запятую, если есть.select
domain.id,domain.title,domain.url,
count(DISTINCT(session.id)) as rank,
domain.flag,domain.desc ,bnr1, bnr2
from domain
left join session on session.sid = domain.id
left join domainth on domainth.domain_id = domain.id
left join banners on banners.sid = domain.id
where 1 ".(empty($tids) ? '' : " and domainth.theme_id in ($tids) ")."
group by domain.id
order by rank descСейчас, пока кол-во записей исчесляеться сотнями, все более мение работает.
Но позже, мне кажеться, система не выдержит (Из за DISTINCTа).Сначало было так, но данный запрос тогда не правильно счатает рейтинг (количество session.id, а показывает чтото типа [кол-во session.id*кол-во domainth]) :
select
domain.id,domain.title,domain.url,
count(session.id) as rank,
domain.flag,domain.desc ,bnr1, bnr2
from domain
left join session on session.sid = domain.id
left join domainth on domainth.domain_id = domain.id
left join banners on banners.sid = domain.id
where 1 ".(empty($tids) ? '' : " and domainth.theme_id in ($tids) ")."
group by domain.id
order by rank descМешает то, что joinю domainth. если убрать, то считает рейтинг нормально, без DISTINCT. Тоесть я её не так joinю чтоли? пробовал по разному, все равно.
Какие есть варианты -
0. Нормально присоеденять domainth (не знаю как).
1. Сделать поле rating в таблице domain. считать и сохранять туда рейтинг по крону.
но тогда статистика и рейтинг не будед realtime? А какже тогда сделанно на рамблер top 100? там в реале все, зашел на сайт, смотришь, и +1 хит сразу в статистике.2. Посчитать перед выводом весь рейтинг всех доменов так,
select domain.id,count(session.id) as rank
from domain
left join session on domain.id = session.sid
where 1 group by domain.id order by rank desc
но тогда сложно выводить потом домены, отсортированыые по рейтингу, тоесть надо делать 2 запроса, сохранять в PHP 2 массива, и потом выводить..
+ если пользователь открыл какую то категорию, то нет смысла грузить домены, которых нет в данной категории.Прошу помощи SQL Гуру, сам не осилю.
Сделал так :select domain.id,domain.title,domain.url,count(session.id) as rank,domain.flag,domain.`desc`,bnr1, bnr2
from domain
left join session on session.sid = domain.id
left join banners on banners.sid = domain.id
where
domain.id IN (
SELECT domain_id FROM domainth WHERE theme_id in (4,5,6,7,8,9))
group by domain.id
order by rank desc;Вложенный SELECT работает достаточно быстро, т.к. количество доменов не влико.