SQL INNER JOIN и AVG () возвращают неверные данные

Я пытаюсь выбрать все строки из таблицы, содержащей данные о видео, а затем присоединяю все их рейтинги как 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 строку с неправильным средним значением?

Может ли кто-нибудь объяснить мне, почему это происходит и что я могу сделать вместо этого?

Для чего нужен where 1? Кроме того, где ваш пункт group by?

Dan Bracuk 01.05.2018 13:16

Вам следует добавить пункт group by. В большинстве СУБД это ошибка синтаксиса.

HoneyBadger 01.05.2018 13:18

Где 1 выбрать все строки @DanBracuk :)

ii iml0sto1 01.05.2018 13:22

Где 1 выбрать все строки? Выньте его и посмотрите, нет ли разницы в результатах!

Fred 01.05.2018 13:25
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
0
4
78
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Здесь вам нужно использовать 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. Если нет, то, строго говоря, нам придется выполнить еще одно соединение.

Это именно то, что я искал, спасибо большое, Тим :)

ii iml0sto1 01.05.2018 13:22

Не волнуйтесь, переполнение стека @tim не позволяет мне сразу принять ответ :)

ii iml0sto1 01.05.2018 13:38

Попробуйте заменить INNER JOIN на LEFT JOIN. Подробности смотрите в этот ответ и эта страница (ищите AVG + GROUP BY + JOINS)

Другие вопросы по теме