singlepost

Определение места в списке определённого юзера средствами SQL. << На главную или назад  

Суть:

Есть н-ое количество юзеров их нужно упорядочить в списке: по поднятию аккаунта, по рейтингу, дате регистрации. Я это решил так:
"SELECT *
FROM users
ORDER BY lift_account DESC, — время поднятия аккаунта
rating DESC, — рейтинг
reg_time — время регистрации
LIMIT 0, 20"

При этом каждый юзер имеет собственный профиль и внутри этого профиля нужно определить место которое он занимает в вышеприведённом списке.
Пол дня ломал голову, но так и не смог решить это одним запросом.

Помогите.

27 ответов в теме “Определение места в списке определённого юзера средствами SQL.”

  1. 9
    Евгений Ливсон ответил:

    Не знаю есть ли в чистом SQL, но в SQL который в Оракле, есть псевдостолбец ROWNUM, с помощью которого можно получить порядковый номерзаписи в возвращаемом запросе.

    Ваш код может быть примерно таким, хотя может это только в Оракле работает:

    SELECT ROWNUM, sapros.* FROM(SELECT ….. ) AS sapros;

    Где внутри скобок должен быть ваш запрос, который выводит список пользователей с нужной сортировкой.
    Тогда в целом весь этот запрос в качестве первого поля будет выдавать последовательно числа 1, 2 и т.д. по нарастающей, а остальные поля будут из вашего подзапроса.
    Надеюсь понятно написал и без ошибок, т.к. давно не писал запросы.

    На эту тему подробнее можно почитать например тут //www.oracle.com/global/ru/oramag/mayjune2007/w...

  2. 8
    Антон Щиров ответил:

    В общем я проверил. Такая комбинация
    SET @var = 0;
    SELECT
    .@var := @var + 1,
    .*
    FROM
    .my_table;

    В MySQL работает на ура.

  3. 7
    Вова Мухин ответил:

    Евгений Raison_d'être Тюкавкин – Огромное спасибо! Помогло.

  4. 6
    Леонид Максимов ответил:

    >> А если так
    SELECT @var = @var +1, *
    FROM …

    насколько мне известно, будет ругаться.

  5. 5
    Антон Щиров ответил:

    А если так
    SELECT @var = @var +1, *
    FROM users
    ORDER BY lift_account DESC, — время поднятия аккаунта
    rating DESC, — рейтинг
    reg_time — время регистрации
    LIMIT 0, 20

  6. 4
    Евгений Тюкавкин ответил:

    Временные таблицы, процедуры… да еще и полная сортировка таблицы, чтобы получить номер. Как-то это все накладно.
    Если я правильно понял, то пользователю нужно показать анкету, с его данными и номер в списке.

    SELECT target_user.*, (

    SELECT COUNT(*) FROM users all_users
    WHERE
    (all_users.lift_account>target_user.lift_account) OR

    (all_users.lift_account=target_user.lift_account AND all_users.rating>target_user.rating) OR

    (all_users.lift_account=target_user.lift_account AND all_users.rating=target_user.rating AND all_users.reg_time<target_user.reg_time)

    ) as place_number
    FROM users target_user
    WHERE target_user.id=?

    Вот как-то так %)

    Хоть убейте, не пойму зачем нумеровать средствами SQL в исходном запросе, если данные о нумерации потом не используются для чего-нибудь еще. Понумеровать можно и в коде на этапе получения строк или на этапе обработки этих строк или на этапе вывода.

  7. 3
    Антон Щиров ответил:

    Похоже на MySQL. Тогда либо через временную таблицу, либо через процедуру

  8. 2
    Евгений Тюкавкин ответил:

    Место пользователя в списке = количество пользователей в списке выше него + 1
    SELECT COUNT(*) FROM users WHERE …
    Правда часть WHERE у такого запроса будет жутковатой %)

  9. 1
    Леонид Максимов ответил:

    в MS SQL (2005 и выше) есть функция, возвращающая номер записи в наборе. может быть у вас тоже – почитайте документацию. другой вариант – селект во временную таблицу с нумерацией.

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.