За последние 24 часа нас посетили 17663 программиста и 1627 роботов. Сейчас ищут 1152 программиста ...

Позиция строки после сортировки

Тема в разделе "MySQL", создана пользователем DZEN, 26 мар 2008.

  1. DZEN

    DZEN Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    250
    Симпатии:
    0
    Есть такой простой запрос:
    [sql]SELECT id, value FROM table ORDER BY value DESC;[/sql]
    Выдает просто информацию по убыванию.
    Гугл не помог, никак не могу сообразить запрос который выдаст позицию определенного id из такой сортировки.

    Пример:
    --------------
    | id |value|
    --------------
    | 4 | 999 |
    | 3 | 888 |
    | 5 | 777 |
    | 8 | 111 |
    --------------

    id равно 5 - результат запроса должен быть равен трем (позиция строки)
     
  2. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
  3. DZEN

    DZEN Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    250
    Симпатии:
    0
    SET @n:=0;

    SELECT @n:=@n+1 AS N, id, value
    FROM table
    WHERE value >= (SELECT value FROM table WHERE id = 1)
    ORDER BY value DESC;

    В MySQL 4 работать будет?
     
  4. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    в 4.1 да, в 4.0 не помню.
     
  5. stas_t

    stas_t Активный пользователь

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    [sql] select count(*)
    from table t1, table t2
    where t2.id = 5
    and t1.value >= t2.value[/sql]
     
  6. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    Для одиночного, заранее известного ид
     
  7. stas_t

    stas_t Активный пользователь

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
     
  8. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    хотя

    [sql]SELECT count( t2.id ) , t1.id
    FROM table t1, table t2
    WHERE t1.id =5
    AND t1.value <= t2.value
    GROUP BY t1.id[/sql]
    возможно будет быстрее.
     
  9. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    а может и нет, у меня нет двойного перебора.
     
  10. DZEN

    DZEN Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    250
    Симпатии:
    0
    armadillo, намного быстрее работает :).
    Отлаживаю книгу по C# и покупаю по SQL.
    Спасибо.
     
  11. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    что?
    и как на самом деле звучит задача?
     
  12. DZEN

    DZEN Активный пользователь

    С нами с:
    10 сен 2007
    Сообщения:
    250
    Симпатии:
    0
    Ну, имеется ввиду что там еще несколько переборов и подзапросов, в разных запросах по-разному.
    [sql]
    SELECT count( t2.id ) , t1.id
    FROM table t1, table t2
    WHERE t1.id =5
    AND t1.value <= t2.value
    GROUP BY t1.id
    [/sql]
    Сей вариант как "основа" оказался быстрее - больно не бить, по лицу и голове тоже :oops: .
     
  13. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    ок, хотелось бы потестить в чистом виде, а самому тестовую базу городить лень.
     
  14. stas_t

    stas_t Активный пользователь

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    о, понял, что меня тут напрягает. значения в поле table.value должны быть уникальными. иначе надо добавлять дополнительное поле сортировки