Рейтинг записей и групп по - PullRequest
1 голос
/ 22 октября 2011

У меня есть сайт, где люди сохраняют рекорды в играх. Я пытался присвоить рейтинг рекорду игрока, находя количество других рекордов, которые выше. Таким образом, если запрос найдет 5 человек с более высокими показателями, рейтинг рейтинга игрока будет 6.

Дело в том, что в базе данных для каждого пользователя может быть записано более одного счета (за одну и ту же игру). Вот почему я использую пользователя GROUP BY , когда я хочу отображать только лучший результат игрока в игре (не все его результаты в этой игре).

Вот код, который я сейчас использую. Это не работает, так как запрос, кажется, всегда возвращает 2 (как если бы он всегда возвращал, что был только на один балл выше, чем рекорд игрока). Если я удаляю temp GROUP BY пользователя , он возвращает половинное правильное значение, так как подсчитывает все оценки (если игрок набрал несколько очков в игре) от каждого игрока в данной игре.

$count3 = mysql_result(mysql_query("SELECT COUNT(*) + 1 as Num FROM (SELECT * FROM ava_highscores WHERE game = $id AND leaderboard = $get_leaderboard[leaderboard_id] AND score > '$highscore2[score]') temp GROUP BY user");

1 Ответ

2 голосов
/ 22 октября 2011

Когда вы используете GROUP BY, тогда COUNT возвращает количество строк на группу , а не одно число всех строк в наборе результатов. Вместо этого используйте COUNT(DISTINCT ...). Также вам на самом деле не нужен внутренний выбор. Вы можете написать все это одним запросом:

SELECT COUNT(DISTINCT `user`) + 1 AS Num
FROM ava_highscores
WHERE game = '3'
AND leaderboard = '5'
AND score > '1000'

Примечания

  • Убедитесь, что ваш столбец score имеет числовой тип (не тип varchar), чтобы сравнение работало правильно.
  • Добавление индекса на (game, leaderboard, score) сделает запрос более эффективным. Порядок столбцов в индексе также важен.
...