【问题标题】:Mysql table join, but return values if first table has information, but second doesntMysql表连接,​​但如果第一个表有信息则返回值,但第二个没有
【发布时间】:2015-01-18 04:47:39
【问题描述】:

我有以下 mysql 查询

        SELECT Name, Summoner_Name, ROUND(SUM(timePlayed)/60) as Total_Time 
                    FROM UserNames, games_database 
                    WHERE (UserNames.ID = games_database.UserNames_ID AND 
             UserNames.ID IN ({$Member_Ids_Sql}))
                    GROUP BY UserNames.ID 
                    ORDER BY Total_Time DESC;

它会有效地获取玩家姓名、召唤师姓名和总游戏时间。它通过使用表连接来做到这一点。作为一张用户名表,包含用户 ID、姓名和召唤师姓名。 Games_database 表保存玩家玩过的每场比赛。

我要做的是显示 UserNames 表中的用户信息,但还没有玩过任何游戏。

额外信息: 用户名数据库包含 ID、Summoner_ID、Summoner_Name、姓名

Games_database 数据库包含

ID, Match_ID, my_Date, timePlayed, champion, win, Summoner_ID, UserNames_ID, Game_Type

我让所有玩游戏的用户都能完美运行,但是当新用户进入系统时,由于没有玩游戏,他们不会显示在此查询中。

【问题讨论】:

    标签: php mysql


    【解决方案1】:

    您希望 left join 查找不匹配项:

    SELECT Name, Summoner_Name, ROUND(SUM(timePlayed)/60) as Total_Time 
    FROM UserNames LEFT JOIN
          games_database 
          ON UserNames.ID = games_database.UserNames_ID 
    WHERE UserNames.ID IN ({$Member_Ids_Sql}) AND
          games_database.UserNames_ID is null
    GROUP BY UserNames.ID 
    ORDER BY Total_Time DESC;
    

    注意:您应该学会始终使用明确的join 语法。

    【讨论】:

    • 谢谢,虽然那个确切的语法不起作用,但我删除了和 games_database.UserNames_ID 为 null 并且它起作用了 :)。我不完全确定 LEFT Join 是如何工作的,所以我去研究一下。感谢您的帮助!
    【解决方案2】:

    您需要的是左外连接。左外连接将返回第一个表中的所有结果(由您的 where 填充)以及第二个表中的结果。如果没有匹配项,将显示 null。

    【讨论】:

    • 谢谢你,我对 mysql 还很陌生,之前没听说过 left join 命令:)
    • 左连接我们的左外连接几乎适用于所有类型的关系数据库,这里有一个有用的链接解释不同类型的连接w3schools.com/sql/sql_join.asp。听起来你有一个很酷的项目可以开始探索数据库,祝你好运。请接受我们的答案之一,谢谢。
    猜你喜欢
    • 1970-01-01
    • 2018-09-15
    • 2019-12-30
    • 1970-01-01
    • 2018-12-18
    • 1970-01-01
    • 1970-01-01
    • 2012-10-11
    • 1970-01-01
    相关资源
    最近更新 更多