Нумерация строк в БД

lucas

Guest
Нумерация строк в БД

Здравствуйте.

Существует каталог ссылок, хранящий свои данные в БД MySQL.
Основная таблица, которая содержит собственно ссылки, имеет такую структуру:
Код:
id int unsigned auto_increment
description text
url text
rating int unsigned
Также существует таблица рубрик и таблица-связка ссылки/рубрики.

Данные ссылки показываются на главной странице каталога в виде top-списка, отсортированного по рейтингу (столбец rating), при этом ссылки нумеруются 1, 2, 3 и т. д.

Также эти ссылки выводятся на странице рубрики, и, что закономерно, в сортировке по рейтингу идут "с пропусками", т. е. нумеровать их следует, например, так: 54, 61, 158, 159 и т. д.

Нет проблемы пронумеровать ссылки непосредственно в скрипте, выбрав из БД их все, однако хотелось бы знать, не существует ли способа пронумеровать их средствами БД?

Заранее спасибо.
 

Саня

Guest
В БД MySQL записи никак не пронумерованы.
Если я правильно понял предложение:
Также эти ссылки выводятся на странице рубрики, и, что закономерно, идут не по порядку, т. е. нумеровать их следует, например, так: 54, 61, 158, 159 и т. д.
Если хочется, то надо создать ещё одно поле и самому как-то вести нумерацию. Только зачем всё это надо...
 

lucas

Guest
Если хочется, то надо создать ещё одно поле и самому как-то вести нумерацию.
Хочется производить это динамически на основании сортировки по полю rating.

Только зачем всё это надо...
Чтобы можно было видеть текущее положение ссылки в каталоге по ее рейтингу.
 

Michael Smith

Guest
Спасибо, все великолепно работает
:)
 

fixxxer

К.О.
Партнер клуба
А чем это лучше, чем
PHP:
$num=0;
while ($a = mysql_fetch_row(...)) {
   // blablabla
   $num++
}
?
 

Саня

Guest
ForJest, fixxxer
А что тогда значит
Нет проблемы пронумеровать ссылки непосредственно в скрипте, выбрав из БД их все, однако хотелось бы знать, не существует ли способа пронумеровать их средствами БД?
?
 

Фанат

oncle terrible
Команда форума
это ты у них спрашиваешь?
ты адресом не ошибся? ;-)
 

ForJest

- свежая кровь
Саня
Объясняю. Допустим у тебя есть таблица

id | some_data.

Ты решил завести поле дополнительное, для нумерации. Делаешь ALTER TABLE, получаем.

id | some_data | numeration.

Вот в numeration и нужно проставить порядковые номера, так как они будут
если мы сделаем
SELECT * FROM table1 ORDER BY some_data.
----------------------
Решить ты можешь разными способами. Допустим вытянуть все данные, понумеровать и с помощью UPDATE переделать все записи, или вообще сформировать новую таблицу. Либо же можно сделать что-то типа
[sql]
SET @num:=0;
CREATE TEMPORARY TABLE tmp_rpl
SELECT id, some_data, @num:=@num+1 AS numeration FROM table1 ORDER BY some_data;
REPLACE table1 SELECT * FROM tmp_rpl;
[/sql]
Это и называется средствами БД
 

Саня

Guest
ForJest
Это я и советовал в своём первом посте.
Но в целом это бессодержательный разговор пока что...

lucas
С рейтингом я понимаю, но почему, как это было написано, не проставлять цифры средствами ПХП?
 

Фанат

oncle terrible
Команда форума
а кто такой Michael Smith?

Вообще,топик немного фантасмагоричный.
 

ForJest

- свежая кровь
ForJest
Это я и советовал в своём первом посте.
Но в целом это бессодержательный разговор пока что...
Пофлеймить захотелось? Давай пофлеймим.
Твоё:
Если хочется, то надо создать ещё одно поле и самому как-то вести нумерацию. Только зачем всё это надо...
Его:
Спасибо, все великолепно работает
Мы с ним друг друга поняли, как оказалось. Ты спросил:
А что тогда значит
Я тебе дал развёрнутый ответ. Так и скажи - я не понимаю что ему было нужно и почему решение ForJest'а оказалось правильным ответом. Я тоже не знаю.
Опять же должен тебя разочаровать: ты ничего ему не посоветовал. Если бы ты спросил как мне кактус посадить, а тебе ответили: "Нужно его найти и воткнуть как-нибудь", - сильно бы помог твой совет?
Не мог бы ты формулировать свои мысли несколько точнее и развёрнутее?
 

lucas

Guest
1. Честно говоря не ожидал такой бурной дискуссии. Сожалею, что не смог принять участия. ;)

2. (Michael Smith != lucas && /me == lucas) == true

3. Я проблему решил таким кодом вчера вечером (после поста ForJest'а от 27.03.04 *:46 -- ему огромное спасибо):
Код:
set @num := 0 ;
create temporary table tmp_links (select *, (@num := @num + 1) as position from links order by rating desc) ;
select * from tmp_links where subsection = 2 ;
4. Очень рад, что проблема решилась и у Michael Smith'а. ;)
 

Фанат

oncle terrible
Команда форума
lucas
Будучи сам членом этого форума, ты, я думаю, догадываешься, что всем до жути любопытно, зачем тебе понадобилось такое изобретение, сравнимое с размещением спальных принадлежностей на поверхности комнаты, противоположной полу.

Не поделишься, все же, какую задачу ты решил-то?
 

lucas

Guest
Все очень просто. ;)

В каталоге ссылки могут выводиться как одним top-списком, отсортированном по рейтингу, на главной странице, так и на странице рубрики, к которой эта ссылка принадлежит, полным списком.

Заказчику захотелось, чтобы по аналогии с top-списком, где ссылки нумеруются 1, 2, 3 и т. д. (1 -- самый высокий рейтинг, 2 -- чуть пониже...), на странице рубрики ссылки тоже нумеровались в зависимости от рейтинга. Вышеприведенный код как раз и реализует это.

Я решил нумеровать ссылки средствами БД, так как поразмыслил, что это получится быстрее, чем непосредственно в скрипте, в свете того, что количество ссылок может быть значительным.

Самое главное, что такое решение при внесении небольших изменений позволяет избавиться от необходимости постоянно нумеровать ссылки при запросе страницы.

Например:
1. По ссылке кликнули: обновляем таблицу -- инкрементируем рейтинг ссылки, обновляем нумерацию.
2. Ссылки просматривают: просто выбираем информацию из таблицы.
 

Falc

Новичок
ForJest
Не проще ли:

SET @num := 0;
UPDATE table SET sort = @num := @num + 1 ORDER BY field 1;
 
Сверху