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


Автор: PaulDee 14.2.2009, 14:44
Нужно выбрать новые фотографии, с условием, чтобы не выводились уже отрейтенные фото текущим пользователем. Принцип как у hotornot.com.
Вот что у меня получилось:

1. photo {id,user_id,pic_name}
2. photo_rate {id, rating, photo_id, who_rate_id}

Код

select photo.id,pic_name,user_id from photo 
   where (select count(*) from photo_rate where photo_id = photo.id and who_rate_id=' {id данного пользователя} ') = 0 
       order by photo.id desc limit 1";


Все бы хорошо, но запрос почти ложит мой глюконутый сервер. Хотелось бы сделать его менее ресурсоемким.

Спасибо!


Автор: PaulDee 15.2.2009, 10:07
вот с 6 секунд до 0.1-0.5 дошел, но с увеличением таблицы рейтинга, пропорционально и существенно увеличивается время запроса...

Код

select ph.id from photo ph 
  left join (select who_rate_id,photo_id from photo_rating where who_rate_id='{id юзера}') rp
  on ph.id = rp.photo_id
  where rp.who_rate_id is null
  order by ph.id desc limit 1

Автор: skyboy 15.2.2009, 10:38
Код

SELECT ph.id 
FROM photo ph 
LEFT JOIN photo_rate pr
ON pr.photo_id = ph.id AND pr.who_rate_id = '<id юзера>'
WHERE pr.id is NULL

Но так же быстро, как и INNER JOIN это и не будет. Опять же, индексы не будут задействованы на условие pr.id is NULL.
Может, лучше кешировать результаты проверки?

Автор: PaulDee 15.2.2009, 12:07
skyboy, 
Спасибо большое smile

Кешировать наверное будет не эффективно, т.к. каждый раз результат проверки будет разный.
Буду решать проблему по мере поступления, пока меня такой результат вполне устраивает.

Еще раз спасибо!


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