Помощь в запросе на присоединение - PullRequest
1 голос
/ 22 сентября 2009
SELECT game_ratingstblx245v.game_id,avg( game_ratingstblx245v.rating ) 
         as avg_rating,
       count(DISTINCT game_ratingstblx245v.userid) 
          as count,
       game_data.name,
       game_data.id ,
       avg(game_ratings.critic_rating),count(DISTINCT game_ratings.critic) 
         as cr_count
FROM game_data 
LEFT JOIN game_ratingstblx245v ON game_ratingstblx245v.game_id = game_data.id 
LEFT JOIN game_ratings         ON game_ratings.game_id = game_data.id 
WHERE game_data.release_date < NOW() 
GROUP BY game_ratingstblx245v.game_id 
ORDER BY game_data.release_date DESC,
         game_data.name


В настоящее время я использую этот запрос для извлечения значений из 3 таблиц
game_data - идентификатор (внешний ключ), имя, дата выпуска \ информация об играх
game_ratings - game_id (внешний ключ), критик, рейтинг \ критик рейтинг
game_ratingstblx245v - game_id (внешний ключ), рейтинг, идентификатор пользователя \ рейтинг пользователя


Что я хочу сделать с этим запросом, это выбрать все идентификаторы из таблицы game_data в порядке убывания release_date, а затем проверить среднюю оценку из таблиц game_ratings и game_ratingsblx245v, соответствующих отдельным идентификаторам (если игры не были оценены, результат должен вернуть значение null из полей последних двух таблиц) .. Теперь проблема, с которой я сталкиваюсь, заключается в том, что результат не соответствует ожидаемому (некоторые игры, которые не были оценены, отображаются, а другие нет), можете ли вы, ребята, проверить мой запрос и скажите мне, где я ошибаюсь, если так ... Спасибо

1 Ответ

2 голосов
/ 22 сентября 2009

Вы не должны использовать столбец game_ratingstblx245v.game_id в своей группе GROUP BY, поскольку он может быть равен NULL, если для данного идентификатора игры нет оценок. Вместо этого используйте game_data.id.

Вот как бы я написал запрос:

SELECT g.id, g.name,
       AVG( x.rating ) AS avg_user_rating,
       COUNT( DISTINCT x.userid ) AS user_count,
       AVG( r.critic_rating ) AS avg_critic_rating, 
       COUNT( DISTINCT r.critic ) AS critic_count
FROM game_data g
LEFT JOIN game_ratingstblx245v x ON (x.game_id = g.id)
LEFT JOIN game_ratings r         ON (r.game_id = g.id)
WHERE g.release_date < NOW() 
GROUP BY g.id 
ORDER BY g.release_date DESC, g.name;

Обратите внимание, что хотя этот запрос производит декартово произведение между x и r, он не влияет на вычисление среднего рейтинга. Просто знайте в будущем, что если вы выполняете SUM() или COUNT(), вычисления могут быть преувеличены непреднамеренным декартовым произведением.

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