【问题标题】:Select with inner join选择内连接
【发布时间】:2015-07-10 00:58:29
【问题描述】:

我需要从两个表中选择一些数据, 请帮我使用内部连接进行此选择。 选择 2 中的玩家不得在选择 1 中... 首先选择:

$rs = "SELECT * 
        FROM `player` 
        WHERE `status`=1 AND `credit`>=1 AND `username` NOT LIKE '$user' 
        ORDER BY ls ASC,credit DESC 
        LIMIT 0 ,10;

第二:该玩家必须从选择结果中移除1

$rs2 = "SELECT * 
        FROM `ip_log` 
        WHERE `playerid`='$ui' AND `win`='1' AND `date`='$date' ";`

【问题讨论】:

  • 这些表有什么关系?
  • INNER JOIN 用于在两个表中查找具有匹配数据的行。如果您只想打印 匹配的行,则不能为此使用INNER JOIN。你可以用LEFT OUTER JOIN来做。
  • 不清楚:您是要显示除选择 1 中的用户之外的所有人的日志消息,还是要显示除选择 2 中具有日志消息的玩家之外的所有玩家?
  • 表与用户 ID ...playerid='$ui'..... 来自 Ip_log 的选择 2 不能在选择 1 的结果中

标签: php sql select


【解决方案1】:

您可以为此使用LEFT JOIN

这显示了不在选择 1 中的每个人的日志消息。

SELECT l.*
FROM ip_log AS l
LEFT JOIN 
    (SELECT username
     FROM player
     WHERE status = 1 AND credit >= 1 AND username NOT LIKE '$user'
     ORDER BY ls ASC, credit DESC 
     LIMIT 10) AS p
ON l.player = p.username
WHERE win = 1 and date = '$date'
AND p.username IS NULL

这显示了前 10 名玩家数据,除了选择 2 中带有日志消息的玩家数据

SELECT p.*
FROM player AS p
LEFT JOIN ip_log AS l ON l.player = p.username AND l.win = 1 AND l.date = '$date'
WHERE p.status = 1 AND p.credit >= 1 AND p.username NOT LIKE '$user'
AND l.player IS NULL
ORDER BY p.ls ASC, p.credit DESC
LIMIT 10

在这两种情况下,使用 IS NULL 测试第二个表中的列会使其仅返回第一个表中在第二个表中没有匹配项的行。见

Return row only if value doesn't exist

【讨论】:

    【解决方案2】:

    你可以用 LEFT JOIN 做到这一点

    SELECT player.*,ip_log.* FROM `player` LEFT JOIN `ip_log` ON player.id!=ip_log.playerid GROUP BY player.id
    

    【讨论】:

    • 你能添加更多条件吗...所有在两个选择中使用的条件
    • 您可以轻松添加条件。只需在“ON”之后的第一个条件之后添加它们。例如ON player.id!=ip_log.playerid AND player.status='1'
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-20
    相关资源
    最近更新 更多