Суть:
Есть н-ое количество юзеров их нужно упорядочить в списке: по поднятию аккаунта, по рейтингу, дате регистрации. Я это решил так:
"SELECT *
FROM users
ORDER BY lift_account DESC, — время поднятия аккаунта
rating DESC, — рейтинг
reg_time — время регистрации
LIMIT 0, 20"
При этом каждый юзер имеет собственный профиль и внутри этого профиля нужно определить место которое он занимает в вышеприведённом списке.
Пол дня ломал голову, но так и не смог решить это одним запросом.
Помогите.
2 ноября 2009 в 23:01
Не знаю есть ли в чистом SQL, но в SQL который в Оракле, есть псевдостолбец ROWNUM, с помощью которого можно получить порядковый номерзаписи в возвращаемом запросе.
Ваш код может быть примерно таким, хотя может это только в Оракле работает:
SELECT ROWNUM, sapros.* FROM(SELECT ….. ) AS sapros;
Где внутри скобок должен быть ваш запрос, который выводит список пользователей с нужной сортировкой.
Тогда в целом весь этот запрос в качестве первого поля будет выдавать последовательно числа 1, 2 и т.д. по нарастающей, а остальные поля будут из вашего подзапроса.
Надеюсь понятно написал и без ошибок, т.к. давно не писал запросы.
На эту тему подробнее можно почитать например тут //www.oracle.com/global/ru/oramag/mayjune2007/w...
2 ноября 2009 в 22:01
В общем я проверил. Такая комбинация
SET @var = 0;
SELECT
.@var := @var + 1,
.*
FROM
.my_table;
В MySQL работает на ура.
2 ноября 2009 в 8:00
Евгений Raison_d'être Тюкавкин – Огромное спасибо! Помогло.
1 ноября 2009 в 14:00
>> А если так
SELECT @var = @var +1, *
FROM …
насколько мне известно, будет ругаться.
1 ноября 2009 в 13:04
А если так
SELECT @var = @var +1, *
FROM users
ORDER BY lift_account DESC, — время поднятия аккаунта
rating DESC, — рейтинг
reg_time — время регистрации
LIMIT 0, 20
1 ноября 2009 в 13:04
Временные таблицы, процедуры… да еще и полная сортировка таблицы, чтобы получить номер. Как-то это все накладно.
Если я правильно понял, то пользователю нужно показать анкету, с его данными и номер в списке.
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 в исходном запросе, если данные о нумерации потом не используются для чего-нибудь еще. Понумеровать можно и в коде на этапе получения строк или на этапе обработки этих строк или на этапе вывода.
1 ноября 2009 в 13:02
Похоже на MySQL. Тогда либо через временную таблицу, либо через процедуру
1 ноября 2009 в 13:01
Место пользователя в списке = количество пользователей в списке выше него + 1
SELECT COUNT(*) FROM users WHERE …
Правда часть WHERE у такого запроса будет жутковатой %)
1 ноября 2009 в 13:01
в MS SQL (2005 и выше) есть функция, возвращающая номер записи в наборе. может быть у вас тоже – почитайте документацию. другой вариант – селект во временную таблицу с нумерацией.