2010-05-27 4 views
4

Мне просто интересно, есть ли более эффективный способ сделать это.Присоединяйтесь к этим двум запросам в один

У меня есть таблица, в которой я отслеживаю оценки пользователей для разных флеш-игр. Таблица games_scores определяется следующим образом:

alt text http://img13.imageshack.us/img13/7262/structure1.png

Каждый пользователь может иметь несколько записей для любой игры в этой таблице. Когда я показываю счетную карточку, я выбираю только показатель MAX для каждого пользователя. Ничего особенного.

То, что я делаю тогда, отображает позицию зарегистрированного пользователя, если его нет на табло (на доске отображаются только 20 игроков). Я сделал это с двумя запросами. Первый из них говорит мне положение пользователя:

SELECT 
COUNT(*) + 1 
FROM (
SELECT 
    MAX(score) 
FROM 
    games_scores gs 
WHERE 
    gs.games_id = ? 
    AND gs.score > (
    SELECT 
    MAX(gs2.score) 
    FROM 
    games_scores gs2 
    WHERE 
    gs2.games_id = ? 
    AND gs2.users_id = ? 
    AND gs2.add_time = ? 
) 
    AND gs.add_time = ? 
GROUP BY 
    gs.users_id 
) AS tmp_table 

И второе дает мне свой счет:

SELECT 
MAX(gs.score) 
FROM 
games_scores gs 
WHERE 
gs.games_id = ? 
AND gs.users_id = ? 
gs.add_time >= ? 

Я интересно, если есть более эффективный способ сделать это? Объединение запросов в один, например.

ответ

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