У меня есть таблица Users, которая содержит столбцы: id, name, points, extra_points. Как я могу получить ранжирование позиции для конкретного пользователя, когда ранг представляет собой сумму очков и лишних точек?
Для всех пользователей список ранга Im, использующий этот запрос: "SELECT id, (points + extra_points) AS total FROM users ORDER BY total desc";
и цикл while с тегом html ol
(так что есть номер позиции). Но я не знаю, как показать ранг для пользователя sinlge (на странице профиля пользователя)? Любая помощь будет отличной.
SELECT users1.id, (users1.points+users1.extra_points) AS total, COUNT(*)+1 AS rank FROM users users1 INNER JOIN users users2 ON users1.points+users1.extra_points < users2.points+users2.extra_points WHERE users1.id = $id
Ну, для одного пользователя вы должны изменить запрос выбора, чтобы он выглядел
"SELECT (points + extra_points) AS total FROM users WHERE id = $id LIMIT 1"
Необходимо указать, какой пользователь в качестве предложения WHERE. Кроме того, поскольку вы, по-видимому, уже знаете идентификатор, не нужно его выбирать, и поскольку это всего лишь один пользователь, не нужно также ORDER BY. И LIMIT 1 остановит его от проверки остальной части строк после ее обнаружения.
это не проверено, но я надеюсь, что вы поймете, что моя идея – просто используйте подзапрос, чтобы подсчитать всех пользователей с большим количеством баллов:
SELECT id, (points + extra_points) AS total, (SELECT COUNT(*) FROM users WHERE (points + extra_points)) >= (u.points + u.extra_points) AS rank FROM users u WHERE id = ?;
Вот ответ, если у вас есть столбец ClientID и Points в таблице Customer:
<CFQUERY DATASOURCE="YourDatasource" name="YourQueryName"> SELECT ClientID, (Pts) AS total, (SELECT COUNT(*) FROM Client WHERE (Pts) >= (u.Pts)) AS rank FROM Client u WHERE ClientID = CLIENTID_OF_YOUR_CHOICE_HERE; </CFQUERY>