2013-08-02 1 views
0

У меня есть следующие таблицыQuery optimazation

chapters 
    id 
    title 
videos 
    id 
    chapter_id 
    video_url 
viewed_videos 
    id 
    member_id 
    video_id 
    viewed_date 

Я использую следующий запрос прямо сейчас.

select 
    c.id, 
    c.title, 
    c.duration, 
    c.visible, 
    v.id as vid, 
    v.title as video_title, 
    v.chapter_id, 
    v.duration as video_duration, 
    (select count(*) from viewed_videos where video_id = v.id and member_id=32) as viewed 
from chapters as c 
left join videos as v 
on 
c.id = v.chapter_id 
where 
c.tutorial_id = 19 

Это лучший способ запросить все видео с полем просмотра?

Я думаю, что должно быть лучше, чем этот путь, так как я использую подзапрос.

ответ

2

Вам не нужен подзапрос. Вы можете сделать присоединиться и агрегация на внешнем уровне:

select c.id, c.title, c.duration, c.visible, v.id as vid, v.title as video_title, 
     v.chapter_id, v.duration as video_duration, v.video_token, count(*) as viewed 
from chapters as c left join 
    videos as v 
    on c.id = v.chapter_id left join 
    viewed_videos vv 
    on vv.video_id = v.id and member_id=32 
where c.tutorial_id = 19 
group by c.id, v.id; 

Однако подзапрос не такая уж плохая вещь. На самом деле, вполне возможно, что производительность лучше с подзапросом, чем с этой версией.