SQL INNER JOIN и AVG () возвращают неверные данные - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь выбрать все строки в таблице, содержащей данные о видео, а затем я присоединяюсь ко всем их оценкам как AVG() из другой таблицы.

Дело в том, что есть только 1 строка для каждого видео, но есть много оценок для каждого видео, поэтому я должен получить все оценки и найти среднее значение для каждого видео.

У меня есть этот кусок 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 строку с неправильным средним значением?

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

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

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

0 голосов
/ 01 мая 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...