代码之家  ›  专栏  ›  技术社区  ›  halocursed

联接查询中的帮助

  •  1
  • halocursed  · 技术社区  · 16 年前
    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个表中提取值
    游戏数据-ID(外键),名称,发布日期\游戏信息
    游戏评级-游戏ID(外键)、评论家、评级\评论家评级
    游戏等级tblx245v-游戏ID(外键),等级,用户ID\用户等级


    我想用这个查询来做的是按发布日期降序从表游戏的数据顺序中选择所有的ID,然后检查表游戏的平均评级和与个人ID相对应的游戏评级BLX245V(如果游戏没有评级,结果应该从后两个表的字段返回空值)。现在我面临的问题是结果没有如预期的那样出现(有些游戏还没有被评分,而另一些没有被评分),你们能查查我的问题并告诉我哪里出错吗?如果是,谢谢。

    1 回复  |  直到 16 年前
        1
  •  2
  •   Bill Karwin    16 年前

    你不应该使用 game_ratingstblx245v.game_id 分组依据中的列,因为当给定游戏ID没有分级时,该列可能为空。请使用 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() 计算结果可能会被无意中得到的笛卡尔积夸大。