PHP

Как узнать положение элемента в базе данных?

У меня есть MySQL таблица test со столбцами: id(int) | name(string) | money(int)
В ней есть неопределенное кол-во записей и нужно сделать что-то вроде топа.
Нужно узнать: На каком месте находится пользователь с id = 228
узнали сколько у него денег
SELECT test.money FROM test WHERE test.id=228

а теперь применим это в запросе сколько пользователей имеет больше денег
SELECT COUNT(*) as nTop FROM test WHERE test.money > ( SELECT money FROM test WHERE id=228 )

знаичт его (и тех, у кого столько же денег) место
nTop + 1

===

А еще можно решить эту задачу с помощью VIEW, где какой-то столбец будет отвечать за место, но будет очень-очень медленно, зато правильнее, чем кешировать результат. Собственно, этот VIEW и надо будет копировать (=такая реализация кеширования, средствами mysql) в таблицу раз в * минут.
Павел Шевченко
Павел Шевченко
27 070
Лучший ответ
Для этого вам надо использовать т. н. indexes (индексы, скорее всего так по-русски).
Они как раз используются для ускорения операций сортировки по какому-то полю (в вашем случае по полю "Money").
Пример-аналогия из реальной жизни, чтоб вам было понятнее:
Вы пришли в большую ленинскую библиотеку и хотите прочитать какую-то определенную книжку.
Вы идете в каталог и там по имени автора находите нужную книжку, узнаете, в каком шкафу и на какой полке она стоит. Идете и читаете ее.
Здесь вся ленинская библиотека - это база данных с неопределенным количеством элементов.
Каталоги с карточками книг - это и есть индекс по какому-то полю.
Без каталога с карточками вам бы пришлось перерывать последовательно все шкафы и полки, пока не найдете искомую книгу (ну или не найдете).
Игорь Ланкин
Игорь Ланкин
80 385
если нужен топ, то
SELECT
*
FROM
test
ORDER BY
money DESC,
name

если нужно положение в этом топе конкретно id=228, то
SELECT
count(*)
FROM
test a
JOIN test b ON b.id = 228
WHERE
a.money > b.money
or (a.money=b.money and a.name <= b.name)

наверно как-то так.
Очевидно, на 228 месте?))
Владислав Рязанцев Логично, но не то, что задумывалось