Узнать порядковый номер записи в БД

yeaahhh

Старатель
Регистрация
8 Май 2008
Сообщения
278
Реакции
11
Друзья, никак не могу найти ( а в запросах я не силен) работающий пример по следующей задаче:
На сайте есть рейтинг (выводятся записи из БД).

1. Запись №1
2. Запись №2
3. Запись №3

Можно ли составить запрос так, чтобы можно было бы узнать номер места определенной записи? (порядковый номер записи согласно какому-то условию).
Т.е. узнать, что Запись №3 идет на 3 месте..

Буду очень благодарен..
 
как то так
Код:
SELECT @i:=@i+1 AS RowNumber, t.*
FROM `имя таблички` t, (SELECT @i:=0) foo
ORDER BY `колонка с именем`
 
Расшифруй, что значит "порядковый номер записи".
Для примера покажи вывод запроса SHOW CREATE TABLE имя_таблицы.
 
Расшифруй, что значит "порядковый номер записи".
Для примера покажи вывод запроса SHOW CREATE TABLE имя_таблицы.
та походу ТС нужно знать индекс (вычисляемое) по какомуто критерию, я запостил пример с сортировкой, там можно впихнуть что угодно. Единственное, что я не уточнил - это MySQL или MSSQL, потому как в MSSQL есть функция ROW_NUMBER
 
та походу ТС нужно знать индекс (вычисляемое) по какомуто критерию, я запостил пример с сортировкой, там можно впихнуть что угодно. Единственное, что я не уточнил - это MySQL или MSSQL, потому как в MSSQL есть функция ROW_NUMBER
Код:
$db->query("SELECT @i:=@i+1 AS RowNumber, t.*FROM dle_post t, (SELECT @i:=0) foo WHERE title = 'Запись №2' ORDER BY kp DESC");
На выходе всегда получается 1..
Может я что-то не так добавил в запрос..? Не силен в сложных запросах..
Нужно получить $row['RowNumber'] = 2..
так как:
1. Запись №1
2. Запись №2
3. Запись №3
4. Запись №4
5. Запись №5
 
PHP:
SELECT SUBSTR('Запись №2' FROM -1 FOR 3)
- для формата когда тайтл равен "Запись №***", где 3 звёздочки cоответствуют максимум 3 искомым символам (максимальный номер записи 999). Если надо больше или меньше играйте параметром FOR 3.

Или применительно к вашему случаю:
PHP:
$db->query("SELECT SUBSTR(`title` FROM -1 FOR 3) RowNumber, * FROM dle_post  WHERE title = 'Запись №2' ORDER BY kp DESC");

PS: если формат предполагает и другие символы после "Запись №*", типа "Запись №* от 4 апреля 2014 года, повествующая о нашествии...", то SQL придётся сильно усложнить функциями IF, LOCATE, SUBSTRING и возможно REVERSE. Потому как MySQL нормального regexp для селекта не сделал...
 
Последнее редактирование:
PHP:
SELECT SUBSTR('Запись №2' FROM -1 FOR 3)
- для формата когда тайтл равен "Запись №***", где 3 звёздочки cоответствуют максимум 3 искомым символам (максимальный номер записи 999). Если надо больше или меньше играйте параметром FOR 3.

Или применительно к вашему случаю:
PHP:
$db->query("SELECT SUBSTR(`title` FROM -1 FOR 3) RowNumber, * FROM dle_post  WHERE title = 'Запись №2' ORDER BY kp DESC");
Для просмотра ссылки Войди или Зарегистрируйся, спасибо большое за помощь) Но я дико извиняюсь, что ввел вас в заблуждения - мне очень неудобно..
Название строки "Запись 2", я привел как образец..
У меня записи имеют различные названия..
Например. В рейтинге (по обычному селект выводу
Код:
$db->query( "SELECT id, origname, status, title, alt_name, kp, imdb FROM my_post ORDER BY kp DESC" );
)
сериал Древние идет на 3 месте.
Вот мне нужно составить такой запрос, чтобы при условии WHERE title="Древние" результатом являлась цифра 3...
 
Код:
$db->query("SELECT @i:=@i+1 AS RowNumber, t.*FROM dle_post t, (SELECT @i:=0) foo WHERE title = 'Запись №2' ORDER BY kp DESC");
На выходе всегда получается 1..
Может я что-то не так добавил в запрос..? Не силен в сложных запросах..
Нужно получить $row['RowNumber'] = 2..
так как:
1. Запись №1
2. Запись №2
3. Запись №3
4. Запись №4
5. Запись №5
у вас получается 1 потому что WHERE ограничивает строки до 1. глянул пост выше и не совсем понял связи между строкой Древние и цыфрой три. Поясните ещё раз.
Так у Вас?:
"ID" | "Название" | "kp"
15 | Лост | 4
17 | Фриндж | 1
18 | Другие | 2
21 | Мотель Бейтса | 3

то если вы выполните запрос
Код:
SELECT @i:=@i+1 AS RowNumber, t.Название FROM dle_post t, (SELECT @i:=0) foo
ORDER BY kp DESC
то у вас получится
1 Лост
2 Мотель Бейтса
3 Другие
4 Фриндж
 
Последнее редактирование:
То что он оказывается на 3 месте, обусловлено полем kp, предполагаю что это рейтинг на kinopoisk, если иначе покажите пример выборки по данному запросу (5 строк достаточно).

В таком случае проще всего ввести дополнительную таблицу рейтинга:
Код:
CREATE TABLE `top` (
`id`  int NOT NULL ,
`top_kp`  smallint NOT NULL ,
PRIMARY KEY (`id`)
)
ENGINE=MyISAM;

по крону выполнять 2 запроса:
PHP:
TRUNCATE TABLE `top`;
INSERT INTO `top` (`id`, `top_kp`) SELECT id, @i:=@i+1 FROM my_post, (SELECT @i:=0) foo ORDER BY kp DESC  LIMIT 100; #100 - максимальное число фильмов для топа, например: 10, 50, 250

Для выборки использовать LEFT JOIN:
PHP:
$db->query( 'SELECT p.id, p.origname, p.status, p.title, p.alt_name, p.kp, p.imdb, t.top_kp FROM my_post p
 LEFT JOIN `top` t ON p.id = t.id
 WHERE p.title="Древние"
 ORDER BY kp DESC' );
для фильмов вне рейтинга t.top_kp будет равен null - это уже на уровне php фильтруй
 
Последнее редактирование:
Если еще актуально, то можно еще подумать над решением с помощью триггера. Но в целом, идея с дополнительной таблицей - правильная.
 
Назад
Сверху