Задавайте вопросы, мы ответим
Вы не зашли.
есть табличка viewing (videoid, timestamp) и табличка video (id, title)
при просмотре видео пользователями в таблицу viewing вносятся id ролика и текущее время
необходимо вытащить 5 последних просмотренных роликов, естественно без повторов
последние записи в таблице viewing:
119 1284821160 65 1284821090 119 1284821014 21 1284820846 116 1284820781
select id, title from videos, viewing where videoid = id order by timestamp desc limit 5
вытаскивает 5 последних записей с повторами
select distinct id, title from videos, viewing where videoid = id order by timestamp desc limit 5
вытаскивает совсем не то...
119 title 118 title 117 title 115 title 116 title
Неактивен
По производительности оптимально будет исключать повторы на уровне PHP (выбирать с запасом, например 10, а если не хватит делать повторный запрос). На MySQL можно решить задачу подзапросом, но тогда потребуется сортировать всю таблицу video.
Неактивен
либо я где то ошибся либо еще что то
запрос этот стал грузить процессор на 100%
# Query_time: 6.304332 Lock_time: 0.000287 Rows_sent: 5 Rows_examined: 3085368
записей в viewing ~12500
записей в video 243
то есть он делает декартово произведение таблиц а потом уже его сортирует...
может есть какое то еще решение? количество строк очень быстро растет )
пытался решить тоже самое на php - в итоге загрузка 100% процессами apache...
Отредактированно MAKAPOH (22.09.2010 21:33:07)
Неактивен
можно хранить отдельно время последнего просмотра для каждого видео, что то вроде last_viewing (videoid, timestamp). тогда получение n последних просмотренных видео выльется в один простенький запрос.
Неактивен
Да, или так, как говорит avgsoft, или можете написать курсор, который будет
бежать по таблице по индексу, пока не найдет нужное количество строк.
Группировка и сортировка по другому столбцу всегда будут вызывать filesort.
Но в Вашем случае можно схитрить, т.к. известно, что будет вытащено лишь
небольшое количество строк.
Неактивен