рассчитать ранг в рекорд по 2 таблицам - PullRequest
0 голосов
/ 07 сентября 2010

У меня есть игра-викторина, и я хочу наградить пользователей за 2 события:
1) отвечая правильно
2) отправка вопроса в пул вопросов

Я хочу запросить рейтинг и рейтинг конкретного игрока, и я использую этот запрос:

SELECT (correct*10+sent*30) AS score, @rank:=@rank+1 AS rank 
FROM   (  trivia_players 
          JOIN (  SELECT COUNT(*) AS sent, senderid 
                  FROM trivia_questions 
                  WHERE senderid='$userid'
               ) a 
          ON trivia_players.userid=a.senderid
       )  
       ORDER BY score DESC

и это работает, если игрок находится в обеих таблицах, то есть правильно ответил И отправил вопрос. но это не работает, если игрок не отправил вопрос

Есть идеи, как исправить этот запрос? ($ userid - это заданный параметр)

спасибо!

Спасибо, Том! Единственная проблема в том, что ряды неверны:
ранг идентификатора пользователя
58217 380 1
12354 80 3
32324 0 2

Ответы [ 2 ]

1 голос
/ 07 сентября 2010

Я бы, наверное, сделал это так:

SELECT
    user_id,
    score,
    rank
FROM
(
    SELECT
        TP.user_id,
        (TP.correct * 10) + (COUNT(TQ.sender_id) * 30) AS score,
        @rank:=@rank + 1 AS rank
    FROM
        Trivia_Players TP
    LEFT OUTER JOIN Trivia_Questions TQ ON
        TQ.sender_id = TP.user_id
    GROUP BY
        TP.user_id,
        TP.correct
    ORDER BY
        score DESC
) AS SQ
WHERE
    SQ.user_id = $user_id

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

Ключи в том, что вы выполняете COUNT для столбца, отличного от NULL, из вопросов викторины, чтобы он подсчитывал их пользователем, и вам нужно использовать подзапрос, чтобы вы могли получать ранги для каждого, ДО ограничения для конкретного пользователя ID.

0 голосов
/ 07 сентября 2010

Вы пытались использовать RIGHT JOIN или LEFT JOIN ?Просто с моей головы!

...