2010-07-29 2 views
1

У меня странная проблема. Когда я запускаю этот скрипт, я получаю 10 записей из базы данных, но все они одинаковы. Я понятия не имею, что я делаю неправильно или как это исправить. Пожалуйста, помогите мне.Как получить последние 10 записей из таблицы базы данных mysql?

У меня есть таблицы AMCMS_highscores, AMCMS_users, AMCMS_games Я хочу заглянуть в таблицу AMCMS_highscores, получить последние 10 записей, но только там, где полевые игры - это, например, 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, я не имею в виду, чтобы скопировать это, но я сделал случайно. Когда его с «=» знак (highscores.userkey = users.userkey) я получаю пустой запрос так, что техника его подводит исправить :(

Я надеюсь, что этот вопрос будет легче понять :)

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_users, для которых нет соответствующей строки в AMCMS_highscores, вам необходимо сделать LEFT JOIN и проверить значения NULL в объединенной таблице. Вот выдержка из JOIN Syntax:

Если нет соответствующей строки для правой таблицы в ON или USING части в LEFT JOIN, ряд со всеми столбцов устанавливаются в 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. userkey не равно AMCMS_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. Он принимает только пользователей, у которых не имеют тот же пользовательский ключ, что и в таблице рекордов. Попробуйте изменить != на =.

Смежные вопросы