Я пытаюсь выбрать все строки из таблицы, содержащей данные о видео, а затем присоединяю все их рейтинги как AVG()
из другой таблицы.
Дело в том, что для каждого видео есть только одна строка, но много оценок для каждого видео, поэтому мне нужно получить все оценки и найти среднее значение для каждого видео.
У меня есть этот кусок SQL
SELECT t1.video_id,
t1.video_title,
t1.video_url,
t1.video_views,
AVG(t2.videos_rating_rating) AS rating
FROM videos_approved t1
INNER JOIN videos_rating t2
ON t1.video_id = t2.videos_rating_video_fk
WHERE 1
ORDER BY video_id
DESC LIMIT 12
SQL возвращает результат, но возвращает только 1 строку с неправильным средним значением?
Может ли кто-нибудь объяснить мне, почему это происходит и что я могу сделать вместо этого?
Вам следует добавить пункт group by
. В большинстве СУБД это ошибка синтаксиса.
Где 1 выбрать все строки @DanBracuk :)
Где 1 выбрать все строки? Выньте его и посмотрите, нет ли разницы в результатах!
Здесь вам нужно использовать GROUP BY
. В вашем текущем запросе вы берете среднее значение по всей таблице.
SELECT
t1.video_id,
t1.video_title,
t1.video_url,
t1.video_views,
AVG(t2.videos_rating_rating) AS rating
FROM videos_approved t1
INNER JOIN videos_rating t2
ON t1.video_id = t2.videos_rating_video_fk
GROUP BY
t1.video_id
ORDER BY
t1.video_id DESC
LIMIT 12
Обратите внимание, что в моем ответе предполагается, что video_id
является первичным ключом таблицы videos_approved
, и в этом случае мы можем выбрать любой столбец из этой таблицы даже при группировке с помощью video_id
. Если нет, то, строго говоря, нам придется выполнить еще одно соединение.
Это именно то, что я искал, спасибо большое, Тим :)
Не волнуйтесь, переполнение стека @tim не позволяет мне сразу принять ответ :)
Попробуйте заменить INNER JOIN
на LEFT JOIN
.
Подробности смотрите в этот ответ и эта страница (ищите AVG
+ GROUP BY
+ JOINS
)
Для чего нужен
where 1
? Кроме того, где ваш пунктgroup by
?