2010-07-29 198 views
1

我有一個奇怪的問題。當我運行這個腳本時,我從數據庫中獲得了10條記錄,但它們都完全一樣。我不知道我在做什麼錯誤或如何解決它。請幫幫我。如何從mysql數據庫表中檢索最後10條記錄?

我有表AMCMS_highscores,AMCMS_users,AMCMS_games我想看看AMCMS_highscores表內,得到最後10條記錄,但只有場gameid是1997年例如。任何幫助表示讚賞。

$data = query("SELECT `AMCMS_highscores`.`primkey` , `AMCMS_highscores`.`gameid` , `AMCMS_highscores`.`score` , `AMCMS_users`.`username` , `AMCMS_highscores`.`status` , `AMCMS_highscores`.`userkey` , `AMCMS_games`.`primkey` , `AMCMS_games`.`gamename` FROM `AMCMS_highscores` , `AMCMS_games` , `AMCMS_users` WHERE `AMCMS_highscores`.`gameid` = '$gameid' AND `AMCMS_highscores`.`userkey` != `AMCMS_users`.`userkey` AND `AMCMS_highscores`.`gameid` = `AMCMS_games`.`primkey` AND `AMCMS_highscores`.`status`= 'approved' ORDER by `AMCMS_highscores`.`primkey` DESC LIMIT 0, 10"); 

Print "<table border cellpadding=3>"; 
while($info = mysql_fetch_array($data)) { 
    Print "<tr>"; 
    Print "<th>Score:</th> <td>".$info['score'] . "</td> "; 
    Print "<th>ID:</th> <td>".$info['userkey'] . " </td></tr>"; } 
Print "</table>"; 

下面是查詢的格式化版本:

SELECT 
    `AMCMS_highscores`.`primkey` , `AMCMS_highscores`.`gameid` , 
    `AMCMS_highscores`.`score` , `AMCMS_users`.`username` , 
    `AMCMS_highscores`.`status` , `AMCMS_highscores`.`userkey` , 
    `AMCMS_games`.`primkey` , `AMCMS_games`.`gamename` 
FROM `AMCMS_highscores` , `AMCMS_games` , `AMCMS_users` 
WHERE `AMCMS_highscores`.`gameid` = '$gameid' 
AND `AMCMS_highscores`.`userkey` != `AMCMS_users`.`userkey` 
AND `AMCMS_highscores`.`gameid` = `AMCMS_games`.`primkey` 
AND `AMCMS_highscores`.`status`= 'approved' 
ORDER by `AMCMS_highscores`.`primkey` DESC 
LIMIT 0, 10 

哎呀,我沒有故意要複製,但我沒有意外。 當它與「=」號(highscores.userkey = users.userkey)我得到空的查詢,以便didnt解決它:(

我希望這個查詢是比較容易理解:)

SELECT highscores.primkey, highscores.gameid, highscores.score, users.username, 
highscores.status, highscores.userkey, games.primkey, games.gamename 

FROM AMCMS_highscores AS highscores, AMCMS_games as games, AMCMS_users as users 

WHERE highscores.gameid = '$gameid' AND 
     highscores.status = 'approved' 

ORDER by highscores.primkey DESC LIMIT 0, 10 

下面是結果:

http://www.gamesorbiter.com/FB_app/play.php?gameid=1997 (在遊戲中)

順便說一句,當你將它張貼你如何編寫查詢?我點擊了代碼按鈕,只有代碼的第一行被編碼。

+1

請格式化您的查詢,使其可讀性,以便我們可以幫助您 – Gopi 2010-07-29 04:22:56

回答

2

如果您嘗試從AMCMS_users中選擇AMCMS_highscores中沒有匹配行的記錄,那麼您需要執行LEFT JOIN,並在連接表中測試NULL值。下面是JOIN Syntax的摘錄:

如果在一個LEFT JOIN沒有匹配一行在ONUSING 部分 右表,設置爲NULL所有 列一排用於 右表。

您的查詢會因此看起來更像是這樣的::

SELECT 
    `AMCMS_highscores`.`primkey` , `AMCMS_highscores`.`gameid` , 
    `AMCMS_highscores`.`score` , `AMCMS_users`.`username` , 
    `AMCMS_highscores`.`status` , `AMCMS_highscores`.`userkey` , 
    `AMCMS_games`.`primkey` , `AMCMS_games`.`gamename` 
FROM `AMCMS_highscores` 
LEFT JOIN `AMCMS_users` 
    ON `AMCMS_highscores`.`userkey` = `AMCMS_users`.`userkey` 
JOIN `AMCMS_games` 
    ON `AMCMS_highscores`.`gameid` = `AMCMS_games`.`primkey` 
WHERE `AMCMS_highscores`.`gameid` = '$gameid' 
AND `AMCMS_highscores`.`status`= 'approved' 
AND `AMCMS_users`.`userkey` = NULL 
ORDER by `AMCMS_highscores`.`primkey` DESC 
LIMIT 0, 10; 

暫時忽略其他的條件可以在那些在另一個表中沒有 對應表中利用這一點來 查找行,您的查詢正在查看AMCMS_highscores中的每一行,並將其加入AMCMS_highscores中的每一行,其中AMCMS_highscoresuserkey不等於AMCMS_usersuserkey。這會產生很多匹配的行。要查看發生了什麼,請從查詢中刪除LIMIT子句。

+0

我沒有找到匹配的行,但連接表固定了所有內容:)非常感謝。 – Krasi 2010-07-29 05:20:49

1

與別名同樣的事情,一個更好的格式:

SELECT highscores.primkey, highscores.gameid, highscores.score, users.username, 
highscores.status, highscores.userkey, games.primkey, games.gamename 

FROM AMCMS_highscores AS highscores, AMCMS_games as games, AMCMS_users as users 

WHERE highscores.gameid = '$gameid' AND 
     highscores.userkey != users.userkey AND 
     highscores.gameid = games.primkey AND 
     highscores.status = 'approved' 

ORDER by highscores.primkey DESC LIMIT 0, 10 

你沒有說什麼表計劃是,但我的猜測是,這個問題是在WHERE部分,更具體highscores.userkey != users.userkey。它僅接受不具有與高分表中的用戶相同的用戶。嘗試將!=更改爲=

相關問題