2015-07-10 111 views
0

我需要从两个表中选择一些数据, 请帮助我使用内部联接进行此选择。 玩家在selction2不能在选择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' ";` 
+0

如何在这些表相关? –

+1

'INNER JOIN'用于查找具有匹配数据的两个表中的行。如果你只想打印那些不匹配的行,那么你不能使用'INNER JOIN'。你可以用'LEFT OUTER JOIN'来完成。 – Barmar

+0

目前还不清楚:除了选择1中的用户之外,您是否想为所有人显示日志消息,或者是否希望显示除​​了选择2中的日志消息之外的所有玩家? – Barmar

回答

0

的结果中删除您可以使用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

0

您可以用左手做JOIN

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

您是否可以添加更多条件...用于两个选择的所有条件 – hamid

+0

您可以轻松添加条件。在'ON'之后,只需在第一个条件之后添加它们即可。例如ON player.id!= ip_log.playerid AND player.status ='1' – Mojtaba