|
|
|
| Здравствуйте,
у меня есть таблица вида:
id|name|comm_nums|
Я делаю топ пользователей через запрос:
SELECT * FROM users ORDER BY comm_nums DESC LIMIT 10;
Но тут появилась потребность в выводе позиции каждого пользователя в топе.
Пока я решил зту задачу простой выборкой всех пользователей и потом уже в цикле сравниваю id пользователя с тем, у которого нужно узнать позицию. Как временное решение (на сайте ~200 пользователей + кеширование результата запроса раз в сутки) оно спасает, но интересует как можно решить эту задачу правильно, с минимальной нагрузкой на mysql и php? Возможно ли обойтись одним запросом к бд? Может кто-нибудь знает другой алгоритм поиска позиции?
Спасибо за внимание:) | |
|
|
|
|
|
|
|
для: itx
(29.03.2010 в 10:43)
| |
SET @comm_nums=(SELECT `comm_nums` FROM `users` WHERE `id`=$id LIMIT 1);
SELECT COUNT(`id`)
FROM `users`
WHERE `comm_nums` >= @comm_nums;
|
| |
|
|
|
|
|
|
|
для: г о с т ь
(29.03.2010 в 10:54)
| | Интересный вариант:)
Спасибо! | |
|
|
|
|
|
|
|
для: г о с т ь
(29.03.2010 в 10:54)
| | comm_nums неуникально, как я понимаю... | |
|
|
|
|
|
|
|
для: Loki
(29.03.2010 в 11:57)
| | Да , не уникально. | |
|
|
|
|
|
|
|
для: itx
(29.03.2010 в 12:03)
| | Значит предложенный выше способ неполон: если у Вас тысяча человек имеют по одному сообщению, то Вы не определите в каком месте этой тысячи находится заданный id. | |
|
|
|
|
|
|
|
для: Loki
(29.03.2010 в 13:15)
| | почему это? если равное кол-во постов, то и место одно. | |
|
|
|
|
|
|
|
для: г о с т ь
(29.03.2010 в 22:30)
| | Да не вопрос. Только тогда Ваш вариант совсем не работает. | |
|
|
|
|
|
|
|
для: г о с т ь
(29.03.2010 в 10:54)
| | тогда уж как-то так:
SET @limit = (SELECT DISTINCT `comm_nums` FROM `users` ORDER BY `comm_nums` DESC LIMIT 10,1);
SELECT a.id,COUNT(b.id) AS cnt FROM
FROM `users` a
JOIN `users` b ON b.`comm_nums` < a.`comm_nums`
WHERE a.`comm_nums` >= @comm_nums
GROUP BY a.id
ORDER BY cnt DESC
|
Но запрос потребует индекс на comm_nums, и даже с ним - не из легких. | |
|
|
|
|
автор: 12341234 (13.06.2010 в 13:56) |
|
|
для: Trianon
(30.03.2010 в 13:25)
| | Ну так просто убрать не больне либо равно а равно и тогда не будут браться все значения, которые равны текущему юзеру и фсё будет правильно выводится | |
|
|
|