Как я могу создать внутренний запрос, чтобы найти trend top 3

#mysql #sql #database #count #sql-order-by

#mysql #sql #База данных #количество #sql-order-by

Вопрос:

Вопрос о SQL. Схема приведена ниже:

Пользователь (идентификатор пользователя: int, имя пользователя: varchar(30), адрес электронной почты: varchar(30), пароль: varchar (30), статус: varchar(15))

Видео (видеоИД: int, идентификатор пользователя:int, Заголовок видео:varchar(60), количество лайков: int, Количество нелюбимых:int, Дата публикации: дата)

Комментарий (commentId:int, userId:int, VideoID:int, commentText:varchar(1000), dateCommented:дата)

Watch(userId:int, VideoID:int, dateWatched: дата)

Те же переменные будут использоваться в качестве внешнего ключа. Из-за этого мне не нужно писать внешние ключи.

А) Перечислите три самых популярных видео за данный интервал времени

(Строка dateStart, Строка dateEnd)

Трендовое видео определяется как наиболее просматриваемое видео за данный интервал (т. Е. Видео, Которое просматривается наибольшее количество раз среди всех).

Вы должны включить dateStart и dateEnd в результат, это ЗАКРЫТЫЙ интервал.

Вывод: заголовок видео, имя пользователя, количество просмотров видео.

Я не мог понять, как я могу найти видео с верхним деревом. Что мне делать при построении внутреннего запроса?

Комментарии:

1. Как бы вы узнали, сколько раз было просмотрено видео? Начните с этого.

Ответ №1:

Если вам нужны лучшие 3 видео за определенный период времени, вы можете сделать:

 select v.videotitle, u.username, count(*) no_watches
from watch w
inner join video v on v.videoid = w.videoid
inner join usr   u on u.userid = v.userid
where w.date_watched between ? and ?
group by v.videoid, u.userid
order by no_watches desc
limit 3
 

between Предикат — это то, как я понимаю «закрытый интервал». Они ? относятся к параметрам запроса, которые содержат начальную и конечную дату.

Предварительная агрегация может сделать запрос более эффективным:

 select v.videotitle, u.username, w.no_watches
from (
    select videoid, count(*) as no_watches
    from watch
    where date_watched between ? and ?
    group by videoid
    order by no_watches desc limit 3
) w
inner join video v on v.videoid = w.videoid
inner join usr   u on u.userid = v.userid
order by w.no_watches desc
limit 3