内联或其他什么?

时间:2014-05-03 19:33:52

标签: sql

我试图将2个结果放入1个html表中,用户被踢或被禁止的结果。 UUID是每个用户的唯一代码。

  1. UUID存储在BAT_players中。
  2. 播放器名称也存储在BAT_players
  3. 共有3个表:BAT_players,BAT_ban和BAT_kick
  4. 我试图在html表中获取用户的历史记录,这包括踢和禁令。现在这个历史上只有禁令,我也试图加入踢球。这个查询工作正常,但它只显示禁令。

    SELECT BAT_ban.ban_staff, BAT_ban.ban_state, BAT_ban.ban_server, BAT_ban.ban_begin, BAT_ban.ban_end, BAT_ban.ban_id, BAT_kick.kick_id, BAT_ban.ban_reason, BAT_players.BAT_player, ban_soort
    FROM BAT_players
    INNER JOIN BAT_ban
    ON BAT_ban.UUID=BAT_players.UUID
    

    不幸的是,它没有使用此查询,它给了我一个空的历史记录。我第二次内部联接的错误是什么?

    SELECT BAT_ban.ban_staff, BAT_ban.ban_state, BAT_ban.ban_server, BAT_ban.ban_begin, BAT_ban.ban_end, BAT_ban.ban_id, BAT_kick.kick_id, BAT_ban.ban_reason, BAT_players.BAT_player, ban_soort
    FROM BAT_players
    INNER JOIN BAT_ban
    ON BAT_ban.UUID=BAT_players.UUID
    INNER JOIN BAT_kick
    ON BAT_kick.UUID=BAT_players.UUID ORDER BY ban_id DESC
    ;
    

    谢谢!

3 个答案:

答案 0 :(得分:0)

尝试使用LEFT JOIN

SELECT BAT_ban.ban_staff, BAT_ban.ban_state, BAT_ban.ban_server, BAT_ban.ban_begin, BAT_ban.ban_end, BAT_ban.ban_id, BAT_kick.kick_id, BAT_ban.ban_reason, BAT_players.BAT_player, ban_soort
FROM BAT_players LEFT JOIN 
     BAT_ban ON BAT_ban.UUID=BAT_players.UUID LEFT JOIN 
     BAT_kick ON BAT_kick.UUID=BAT_players.UUID 
ORDER BY ban_id DESC

用空字符串替换NULL值(对于SQL Server):

SELECT ISNULL(BAT_ban.ban_staff,''), ISNULL(BAT_ban.ban_state,''), ISNULL(BAT_ban.ban_server,''), ISNULL(BAT_ban.ban_begin,''), ISNULL(BAT_ban.ban_end,''), ISNULL(BAT_ban.ban_id,''), ISNULL(BAT_kick.kick_id,''), ISNULL(BAT_ban.ban_reason,''), BAT_players.BAT_player, ban_soort
FROM BAT_players LEFT JOIN 
     BAT_ban ON BAT_ban.UUID=BAT_players.UUID LEFT JOIN 
     BAT_kick ON BAT_kick.UUID=BAT_players.UUID 
ORDER BY ban_id DESC

对于MySQL,请将ISNULL替换为IFNULL

答案 1 :(得分:0)

INNER JOIN 在两个表中都需要一个值,因此如果您将其用于踢和禁令,您将只会看到被踢和被禁止的用户。

要显示被禁止被禁止的用户,您需要将两个联接更改为LEFT JOIN,这实际上意味着如果可以的话加入#34;但不要丢弃行如果你不能"#34;这将包括既未被踢过也未被禁止的用户,因此您还需要WHERE子句中的额外条件BAT_ban.ban_id IS NOT NULL OR BAT_kick.kick_id IS NOT NULL

请注意,如果用户有多次禁止和多次踢球,这将为禁令和踢球的每个组合产生一行,因为没有规则来确定哪个禁令应与哪个禁区对齐。

另一种方法是编写两个查询,每个查询使用INNER JOIN,然后组合结果。如果为它们提供相同数量和类型的输出列(对于那些不适用的列留下NULL),可以使用UNION运行它们并一次性返回完整的结果集。

答案 2 :(得分:0)

问题在于" null"在任何内部联接上将从结果集中消除该行。

一种解决方案(也许是最佳解决方案)是使用左连接。

另一种方法是采用两个内连接的UNION。

这是帮助可视化内部,外部,左侧和右侧连接的绝佳链接:

http://www.codeproject.com/Articles/33052/Visual-Representation-of-SQL-Joins