Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Объектно-ориентированное программирование на PHP. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как узнать позицию пользователя в топе? (php+mysql)
 
 автор: itx   (29.03.2010 в 10:43)   письмо автору
 
 

Здравствуйте,
у меня есть таблица вида:
id|name|comm_nums|

Я делаю топ пользователей через запрос:
SELECT * FROM users ORDER BY comm_nums DESC LIMIT 10;

Но тут появилась потребность в выводе позиции каждого пользователя в топе.
Пока я решил зту задачу простой выборкой всех пользователей и потом уже в цикле сравниваю id пользователя с тем, у которого нужно узнать позицию. Как временное решение (на сайте ~200 пользователей + кеширование результата запроса раз в сутки) оно спасает, но интересует как можно решить эту задачу правильно, с минимальной нагрузкой на mysql и php? Возможно ли обойтись одним запросом к бд? Может кто-нибудь знает другой алгоритм поиска позиции?

Спасибо за внимание:)

  Ответить  
 
 автор: г о с т ь   (29.03.2010 в 10:54)   письмо автору
 
   для: 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;

  Ответить  
 
 автор: itx   (29.03.2010 в 11:02)   письмо автору
 
   для: г о с т ь   (29.03.2010 в 10:54)
 

Интересный вариант:)
Спасибо!

  Ответить  
 
 автор: Loki   (29.03.2010 в 11:57)   письмо автору
 
   для: г о с т ь   (29.03.2010 в 10:54)
 

comm_nums неуникально, как я понимаю...

  Ответить  
 
 автор: itx   (29.03.2010 в 12:03)   письмо автору
 
   для: Loki   (29.03.2010 в 11:57)
 

Да , не уникально.

  Ответить  
 
 автор: Loki   (29.03.2010 в 13:15)   письмо автору
 
   для: itx   (29.03.2010 в 12:03)
 

Значит предложенный выше способ неполон: если у Вас тысяча человек имеют по одному сообщению, то Вы не определите в каком месте этой тысячи находится заданный id.

  Ответить  
 
 автор: г о с т ь   (29.03.2010 в 22:30)   письмо автору
 
   для: Loki   (29.03.2010 в 13:15)
 

почему это? если равное кол-во постов, то и место одно.

  Ответить  
 
 автор: Loki   (30.03.2010 в 10:13)   письмо автору
 
   для: г о с т ь   (29.03.2010 в 22:30)
 

Да не вопрос. Только тогда Ваш вариант совсем не работает.

  Ответить  
 
 автор: Trianon   (30.03.2010 в 13:25)   письмо автору
 
   для: г о с т ь   (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)
 

Ну так просто убрать не больне либо равно а равно и тогда не будут браться все значения, которые равны текущему юзеру и фсё будет правильно выводится

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования