Есть база данных с большим количество записей. Есть столбец "point". У каждого человека разное значение. Необходимо сортировать всё по POINT и написать человеку на каком он месте (т.е. по point определить на каком месте сейчас он находиться в очереди, точнее позиция в таблице лидеров) .
Мой вариант решения состоит из: "Сортировать" -> "Циклом посчитать на каком месте совпадает его ID и вывести на экран номер на котором остановился цикл".
Все вроде просто, но а если в базе 100к записей, а у человека point равен почти самому низкому? Это означает что придется перебирать всю базу (что делает достаточно сильную нагрузку) только для того что бы вывести какое то там 100- тысячное место..
Какие есть варианты решения данного задания? Если вы прочитали все, я уже вам благодарен но все таки нужно решение!
Спустя 4 минуты, 54 секунды (16.04.2011 - 20:22) neadekvat написал(а):
Запрос нужен примерно такой:
Соответственно, если point конкретного пользователя известен - заменить подзапрос на это значение.
SELECT COUNT(`user_id`) + 1 as place FROM tbl WHERE point > (SELECT point FROM tbl WHERE user_id = $user_id)
Соответственно, если point конкретного пользователя известен - заменить подзапрос на это значение.
Спустя 15 часов, 57 минут, 53 секунды (17.04.2011 - 12:20) vagrand написал(а):
neadekvat
Ты ошибаешься если думаешь что подзапрос это есть хорошо. Подзапрос будет выполнен для каждой строки, которая будет отобрана в результате выполнения основного запроса, а в твоем случае для всех 100к записей. Мейби это будет даже еще хуже чем вариант ТС-а.
Ты ошибаешься если думаешь что подзапрос это есть хорошо. Подзапрос будет выполнен для каждой строки, которая будет отобрана в результате выполнения основного запроса, а в твоем случае для всех 100к записей. Мейби это будет даже еще хуже чем вариант ТС-а.
Спустя 49 минут, 54 секунды (17.04.2011 - 13:09) Dr.Mars написал(а):
Цитата (vagrand @ 17.04.2011 - 13:20) |
neadekvat Ты ошибаешься если думаешь что подзапрос это есть хорошо. Подзапрос будет выполнен для каждой строки, которая будет отобрана в результате выполнения основного запроса, а в твоем случае для всех 100к записей. Мейби это будет даже еще хуже чем вариант ТС-а. |
с чего ты решил? насколько знаю у mysql есть свой оптимизатор, который на такие то задачи стопудово натравлен
Спустя 3 часа, 38 минут, 19 секунд (17.04.2011 - 16:48) vagrand написал(а):
Dr.Mars
Я взял это из мануала с сайта mysql.com
Я взял это из мануала с сайта mysql.com
Спустя 8 минут, 26 секунд (17.04.2011 - 16:56) Гость_Дмитрий написал(а):
Хорошо, госпобда, так что же делать в этой ситуации?
Спустя 27 минут, 2 секунды (17.04.2011 - 17:23) waldicom написал(а):
В порядке бреда:
выбрать общее количество записей, где очков больше чем у человека. Тогда его место будет количесвто записей + 1
ась?
выбрать общее количество записей, где очков больше чем у человека. Тогда его место будет количесвто записей + 1
ась?
Спустя 5 минут, 23 секунды (17.04.2011 - 17:29) Гость_Дмитрий написал(а):
...
Ха, вы правы, это было логичней всего... Спасибо.
Ха, вы правы, это было логичней всего... Спасибо.
Спустя 2 часа, 28 минут, 17 секунд (17.04.2011 - 19:57) neadekvat написал(а):
Цитата (waldicom @ 17.04.2011 - 18:23) |
выбрать общее количесвто записей, где очков больше чем у человека. Тогда его место будет количесвто записей + 1 |
Цитата (Гость_Дмитрий @ 17.04.2011 - 18:29) |
Ха, вы правы, это было логичней всего... Спасибо. |
Спустя 4 минуты, 13 секунд (17.04.2011 - 20:01) Гость_Дмитрий написал(а):
Цитата (neadekvat @ 17.04.2011 - 16:57) | ||||
|
Извиняюсь, конечно. Я просто не силен в MySql запросах, поэтом и не понял сразу что вы хотели сказать этим
Спустя 4 минуты, 46 секунд (17.04.2011 - 20:06) waldicom написал(а):
Цитата (neadekvat @ 17.04.2011 - 17:57) |
Вы не поверите.. |
Аппладирую стоя