@TanderOFF

Как отсортировать по ORDER BY используя ещё и rowid?

Прошу помощи по сортировке .

при запросе:
nume = cursor.execute("SELECT cash, rowid FROM users WHERE id = {}".format(ctx.author.id)).fetchone()[1]

Получаю: 730 (это моё место в базе без сортировке)
Но хотелось бы как-то отсортировать это по cash и уже получить rowid .
А получить именно значение: 9 (скриншот с сортировкой)6078eddb41d54325977194.png
Пробывал:
nume = cursor.execute("SELECT cash, rowid FROM users WHERE id = {} ORDER BY cash".format(ctx.author.id)).fetchone()[1]

получаю тоже: 730
  • Вопрос задан
  • 89 просмотров
Решения вопроса 1
@o5a
Но хотелось бы как-то отсортировать это по cash и уже получить rowid .

Не путайте понятия
rowid - фиксированный уникальный идентификатор для записей столбца, не зависящий от сортировок (но при некоторых условиях может меняться, в зависимости от объявления).
"место юзера в таблице" при разных сортировках будет разным.
Так что все-таки требуется? Выяснить rowid пользователя по id (что само по себе нелепо, т.к. id сам по себе должен быть уникальный, нет смысла по нему искать rowid)? Или же найти относительный номер пользователя в отсортированном списке?
Если второе - тогда есть row_number, в котором указывается сортировка. Так например можно получить место пользователей по голосовой активности
SELECT id, name, cash, row_number() over(order by cash desc) as rownum FROM users

И соответственно найти порядковый номер пользователя при такой сортировке
cursor.execute("SELECT cash, rowid, rownum FROM (SELECT id, name, cash, row_number() over(order by cash desc) as rownum FROM users) WHERE id = ?", (ctx.author.id, )).fetchone()[2]

rowid и rownum соответственно будут разными (1-й - идентификатор в таблице, 2-й - порядковый номер в сортировке). Т.е. для пользователя с макс. количеством cash rownum будет равен 1, а rowid в зависимости от его идентификатора в таблице.
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
trapwalker
@trapwalker Куратор тега Python
Программист, энтузиаст
Если вам зачем-то нужен rowid, скорее всего вы делаете что-то не так. Для чего он вам нужен?
В реляционных БД положение в таблице (не в выборке, а именно в таблице) ничего не значит. Вы не должны этим управлять и не за чем получать это положение. Уверен, есть другие способы достичь того, что вы там пытаетесь достичь. К примеру, если вам нужно узнать сколько пользователей имеют кэш меньше вашего, то так и запрашивайте:
SELECT count(*) 
FROM users u 
WHERE u.cash < (SELECT cash FROM users WHERE id = :my_user_id)

Если нужен какой-то рейтинг беднейших игроков до вас включительно, то можно использовать сортировку:
SELECT u.id, u.cash 
FROM users u 
WHERE u.cash <= (SELECT cash FROM users WHERE id = :my_user_id)
ORDER BY u.cash

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

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы