2010-07-29 4 views
1

J'ai un problème étrange. Quand j'exécute ce script, j'obtiens 10 enregistrements de la base de données mais ils sont tous exactement les mêmes. Je n'ai aucune idée de ce que je fais de mal ou comment le réparer. Aidez-moi, s'il vous plaît.Comment puis-je récupérer les 10 derniers enregistrements de la table de base de données mysql?

J'ai des tables AMCMS_highscores, AMCMS_users, AMCMS_games Je veux regarder dans la table AMCMS_highscores, obtenir les 10 derniers enregistrements mais seulement où le gameid de champ est 1997 par exemple. Toute aide est appréciée.

$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>"; 

est ici une version au format de la requête:

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, je ne voulais copier cela, mais je l'ai fait par hasard. Quand son avec le signe « = » (highscores.userkey = users.userkey) je reçois requête vide de sorte que na pas fixer :(

J'espère que cette requête serait plus facile à comprendre :)

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 

Voici le résultat:

http://www.gamesorbiter.com/FB_app/play.php?gameid=1997 (sous le jeu)

BTW, comment le code-vous votre requête lorsque vous publiez? J'ai cliqué sur le bouton de code et seule la première ligne du code a été codée.

+1

Veuillez formater votre requête pour la rendre lisible afin que nous puissions vous aider – Gopi

Répondre

2

Si vous essayez de sélectionner des enregistrements de AMCMS_users pour lesquels il n'y a pas de ligne correspondante dans AMCMS_highscores, vous devez effectuer un LEFT JOIN et tester les valeurs NULL dans la table jointe. Voici un extrait de JOIN Syntax:

S'il n'y a pas de ligne correspondante pour la table de droite dans le ON ou USING partie dans un LEFT JOIN, une rangée avec toutes colonnes mises à NULL est utilisé pour la table de droite . Vous pouvez utiliser ce fait pour lignes de trouver dans une table qui n'a pas de contrepartie dans une autre table:

Votre requête se donc plus comme ceci:

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; 

Ignorant les autres conditions pour un moment , votre requête examine chaque ligne dans AMCMS_highscores et la joint à chaque ligne dans AMCMS_highscoresAMCMS_highscores. userkey n'est pas égal à AMCMS_users. userkey. Cela produira beaucoup de lignes correspondantes. Pour voir ce qui se passe, supprimez la clause LIMIT de votre requête.

+0

Je ne cherchais pas de ligne correspondante mais la table de jointure a tout arrangé :) Merci beaucoup. – Krasi

1

Même chose avec des alias et un meilleur format:

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 

vous ne dites pas ce que le système de table était, mais je pense que le problème est dans la partie WHERE, plus particulièrement highscores.userkey != users.userkey. Il n'accepte que les utilisateurs qui ont et n'ont pas la même clé d'utilisateur que dans la table des meilleurs scores. Essayez de changer le != en =.

Questions connexes