SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 18.09.2010 18:49:45

MAKAPOH
Участник
Зарегистрирован: 18.09.2010
Сообщений: 3

выборка с distinct

есть табличка 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

Неактивен

 

#2 18.09.2010 19:09:52

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: выборка с distinct

По производительности оптимально будет исключать повторы на уровне PHP (выбирать с запасом, например 10, а если не хватит делать повторный запрос). На MySQL можно решить задачу подзапросом, но тогда потребуется сортировать всю таблицу video.

SELECT id, title, (SELECT max(timestamp) from viewing WHERE viewind.videoid = video.id) timestamp FROM video ORDER BY timestamp DESC LIMIT 5;

Неактивен

 

#3 20.09.2010 09:36:22

MAKAPOH
Участник
Зарегистрирован: 18.09.2010
Сообщений: 3

Re: выборка с distinct

спасибо smile

Неактивен

 

#4 22.09.2010 21:19:26

MAKAPOH
Участник
Зарегистрирован: 18.09.2010
Сообщений: 3

Re: выборка с distinct

либо я где то ошибся либо еще что то smile
запрос этот стал грузить процессор на 100% smile
# 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)

Неактивен

 

#5 23.09.2010 13:33:35

avgsoft
Завсегдатай
Зарегистрирован: 23.09.2010
Сообщений: 36

Re: выборка с distinct

можно хранить отдельно время последнего просмотра для каждого видео, что то вроде last_viewing (videoid, timestamp). тогда получение n последних просмотренных видео выльется в один простенький запрос.

Неактивен

 

#6 23.09.2010 16:12:05

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: выборка с distinct

Да, или так, как говорит avgsoft, или можете написать курсор, который будет
бежать по таблице по индексу, пока не найдет нужное количество строк.
Группировка и сортировка по другому столбцу всегда будут вызывать filesort.
Но в Вашем случае можно схитрить, т.к. известно, что будет вытащено лишь
небольшое количество строк.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson