Forum Webscript.Ru
Общие => Базы данных => Тема начата: qwer3d от 21 Февраля 2008, 16:42:31
-
Как определить позицию записи в MySQL?
Вот таблица:
| id | time | text |
--------------------------
| 1 | 10-10-2008 | revte|
| 9 | 24-06-2007 | tvrtv |
| 4 | 05-02-2005 | rvt2 |
| 3 | 17-04-2008 | ybt |
Мне нужно определить на какой позиции будет находиться запись с id 9 если отсортировать данные по убыванию колонку time
Должно получиться на третьей позиции находиться.
Пожалуйста помогите. ни как не получаеться.
-
SELECT COUNT(*) as row_number FROM таблица WHERE `time` < (
SELECT `time` FROM таблица WHERE id = 9
)
штото типо так?
-
ravshaniy ДА! Спасибо!
-
Не правильно. Више пример просто считает кол. записей.
в итоге если дата меняеться - то получаеться, что позиция не меняется.
в том-то все и дело, что если изменить время, то поле с id 9 останеться на том же месте. а должно измениться место.
Время сортируеться по убыванию.
Если id 9 изменить время например 2009 год, то id 9 должно быть на первом месте. А получаеться что, выше приведенный пример оставляет ее на том же месте.
-
qwer3d:
в том-то все и дело, что если изменить время, то поле с id 9 останеться на том же месте. а должно измениться место.
вы хотите сделать так чтобы в таблице физически записи перемещались? зачем?
qwer3d:
Время сортируеться по убыванию.
SELECT * FROM таблица ORDER BY `time`DESC
что Вам нужно то и при чем тут id = 9. Извините, я не понимаю смысла Вашей задачи.
-
Физически не надо. Это и не правильно и при больших объемах данных все будет тормозить.
Я пишу рейтинг. Моя задача похожа как на сайте mamba.ru где в анкетах написано на каком месте она находиться.
Когда человек ее поднимает, то меняеться и место, также если он ее не поднимает, то она опускаеться.
-
добавьте поле `_orderby` и сортируйте по нему
SELECT * FROM таблица ORDER BY `_orderby` DESC, `time`DESC
сначала будет сортироваться рейтинг потом при равном рейтинге будет сортироваться время
-
Есть такой вариант:
SET @recNo:=0;
SELECT n FROM (SELECT @recNo := @recNo+1 n, id FROM table ORDER BY time DESC) s WHERE id=22;
этот вариант работает так как надо, но я думаю что будет с нагрузкой в 10.000 изеров при обновлении в 30 сек. страницу
или лучше ваш вариант?
-
Очень любопытный синтаксис, честно говоря впервый раз его встретил в Mysql, и найти документацию по оператору *:=* так же не могу. очень позновательно спасибо.
да Ваш запрос было бы неплохо оптимизировать. немножко. у Вас внутренний подзапрос - есть выборка всех данных. всех строк из таблицы. это есть несколько не хорошо, а в связи с этим этот запрос будет работать быстрее
SELECT COUNT(*) as row_number FROM таблица WHERE `time` < (
SELECT `time` FROM таблица WHERE id = 9
)
по логике они делают одно и тоже, но похоже я ошибся в знаке. получается что нужно:
SELECT COUNT(*) as row_number FROM таблица WHERE `time` > (
SELECT `time` FROM таблица WHERE id = 9
)
-
Интересно что с помощью оператора *:=* можно в один запрос решить задачу, которую часто задают на собеседовании.
Задача:
Как сделать выборку из таблицы{id, goods, quantity }. так чтобы в каждой последующей строке в поле quantity суммировались предыдущии значения.
а с этим оператором получается очень даже просто
-
*:=* это действительно как маленькое чудо получаеться.
сам случайно наткнулся когда искал по иностранным форумам.