2010-07-29 2 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 

OOPS, 나는 그것을 복사하는 것을 의미 didnt는하지만 난 사고로했다. 내가 빈 쿼리를 얻을 때 자신을 "="기호 (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

Btw는

, 당신이 그것을 게시 할 때 어떻게 쿼리를 코딩합니까? 코드 버튼을 클릭하면 코드의 첫 번째 줄만 코딩됩니다.

+1

우리가 당신을 도울 수 있도록 당신의 쿼리를 읽을 수 있도록 포맷하십시오. – Gopi

답변

2

AMCMS_highscores에 일치하는 행이없는 레코드를 AMCMS_users에서 선택하려는 경우 LEFT JOIN을 수행하고 조인 된 테이블에서 NULL 값을 테스트해야합니다. 여기 JOIN Syntax 추출물의하십시오 LEFT JOIN에서 ON 또는 USING 부분에 바로 테이블에 대한 일치하는 행이없는 경우

이 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_highscores입니다. userkeyAMCMS_users과 같지 않습니다. userkey. 그러면 일치하는 행이 많이 생성됩니다. 무슨 일이 일어나고 있는지 보려면 쿼리에서 LIMIT 절을 제거하십시오.

+0

일치하는 행은 찾지 않았지만 조인 테이블은 모든 것을 고쳤습니다. :) 고맙습니다. – Krasi

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에 있다는 것이다. 인 사용자 만 최고 기록 테이블과 동일한 사용자 키를 사용하는 사용자 만 허용됩니다. !==으로 변경해보세요.

관련 문제