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

Тема в разделе "Базы данных", создана пользователем yeaahhh, 4 апр 2014.

Модераторы: latteo
  1. yeaahhh

    yeaahhh

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

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

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

    Буду очень благодарен..
     
  2. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.728
    Симпатии:
    2.105
    как то так
    Код:
    SELECT @i:=@i+1 AS RowNumber, t.*
    FROM `имя таблички` t, (SELECT @i:=0) foo
    ORDER BY `колонка с именем`
     
    yeaahhh и latteo нравится это.
  3. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.519
    Симпатии:
    1.368
    Расшифруй, что значит "порядковый номер записи".
    Для примера покажи вывод запроса SHOW CREATE TABLE имя_таблицы.
     
    yeaahhh и Шумадан нравится это.
  4. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.728
    Симпатии:
    2.105
    та походу ТС нужно знать индекс (вычисляемое) по какомуто критерию, я запостил пример с сортировкой, там можно впихнуть что угодно. Единственное, что я не уточнил - это MySQL или MSSQL, потому как в MSSQL есть функция ROW_NUMBER
     
    yeaahhh нравится это.
  5. yeaahhh

    yeaahhh

    Регистр.:
    8 май 2008
    Сообщения:
    278
    Симпатии:
    11
    Код:
    $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
     
    Шумадан нравится это.
  6. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.519
    Симпатии:
    1.368
    PHP:
    SELECT SUBSTR('Запись №2' FROM -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 для селекта не сделал...
     
    Последнее редактирование: 4 апр 2014
    yeaahhh и Шумадан нравится это.
  7. yeaahhh

    yeaahhh

    Регистр.:
    8 май 2008
    Сообщения:
    278
    Симпатии:
    11
    Перейти по ссылке, спасибо большое за помощь) Но я дико извиняюсь, что ввел вас в заблуждения - мне очень неудобно..
    Название строки "Запись 2", я привел как образец..
    У меня записи имеют различные названия..
    Например. В рейтинге (по обычному селект выводу
    Код:
    $db->query( "SELECT id, origname, status, title, alt_name, kp, imdb FROM my_post ORDER BY kp DESC" );
    )
    сериал Древние идет на 3 месте.
    Вот мне нужно составить такой запрос, чтобы при условии WHERE title="Древние" результатом являлась цифра 3...
     
  8. Шумадан

    Шумадан Хабарра!!11

    Регистр.:
    6 фев 2008
    Сообщения:
    1.728
    Симпатии:
    2.105
    у вас получается 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 Фриндж
     
    Последнее редактирование: 5 апр 2014
    SilverGhost и yeaahhh нравится это.
  9. latteo

    latteo Эффективное использование PHP, MySQL

    Moderator
    Регистр.:
    28 фев 2008
    Сообщения:
    1.519
    Симпатии:
    1.368
    То что он оказывается на 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:=0foo 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 фильтруй
     
    Последнее редактирование: 5 апр 2014
    kibermaster, yeaahhh и Шумадан нравится это.
  10. kibermaster

    kibermaster Писатель

    Регистр.:
    5 апр 2012
    Сообщения:
    8
    Симпатии:
    2
    Если еще актуально, то можно еще подумать над решением с помощью триггера. Но в целом, идея с дополнительной таблицей - правильная.