【问题标题】:Help in a Join query连接查询中的帮助
【发布时间】:2009-09-22 09:09:46
【问题描述】:
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 - id(外键),名称,release_date \游戏信息
game_ratings - game_id(外键),critic, rating \critic rating
game_ratingstblx245v - game_id(外键), rating, userid \user rating


我想要对这个查询做的是从表 game_data 中选择所有 id,按 release_date 降序排列,然后检查表 game_ratings 和 game_ratingsblx245v 对应于个人 id 的平均评级(如果游戏没有被评级,结果应该从后两个表的字段返回 null)..现在我在这里面临的问题是结果没有按预期出现(一些未评级的游戏出现了,而另一些则没有),你们可以检查我的查询并告诉我哪里错了……谢谢

【问题讨论】:

  • 你不应该按 game_data.game_id 分组吗?
  • 这个家伙,我只是忽略了它......谢谢你这样做

标签: sql mysql


【解决方案1】:

您不应在 GROUP BY 中使用 game_ratingstblx245v.game_id 列,因为当给定游戏 ID 没有评分时,它可能为 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;

请注意,尽管此查询会生成 xr 之间的笛卡尔积,但它不会影响平均评分的计算。以后请注意,如果您使用SUM()COUNT(),则计算可能会因意外的笛卡尔积而被夸大。

【讨论】:

  • 感谢 Bill 提供的额外信息,你总是第一个帮助我的人......顺便说一句,我不明白你所说的笛卡尔积是什么意思?
  • 笛卡尔积是一个表中的每一行与第二个表中的每一行相结合的积。假设第一个表中有 10 个匹配行,第二个表中有 12 个匹配行。如果没有条件限制这两者之间的匹配条件,您最终将在结果中得到 120 行。这在像您这样的查询中意味着每个评级表中的行会无意中重复。如果您正在执行 COUNT() 或 SUM(),这将是一个问题。
  • 要查看实际的笛卡尔积,请尝试不使用 GROUP BY 的查询,并显示 rating 列而不是计算 AVG()。你会看到很多重复的行。
  • 是的,你是对的,我早先犯了这个错误,count 的返回值给了我比实际值高得多的奇怪值,但我后来修复了它......
最近更新 更多