Есть ли способ отфильтровать результаты запроса SELECT, с помощью другого запроса SELECT? - PullRequest
0 голосов
/ 03 марта 2019

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

По сути, я хотел бы найти определенную строку в таблице, которая была заказана.Я знаю, как сделать оба, но не вместе.

Я предполагаю, что я пытаюсь сделать, это объединить эти утверждения:

Сортировка:

SELECT * FROM users ORDER BY power DESC;

Фильтрация:

SELECT * FROM otherQueryResult WHERE discordID = discordIDInput;

А затем выясните номер строки, которая возвращается.

Реально, я бы хотел, чтобы результат выглядел примерно так:

+-----------+------+
| discordID | rank |
+-----------+------+
| 123456789 |  52  |
+-----------+------+

Когда мне было 14, мои знания SQL все еще очень ограничены - поэтому я бы предпочел более простые решения, чем rawпроизводительность или удобство использования на данный момент, однако любая помощь приветствуется.

Заранее благодарим за любую помощь.

Ответы [ 3 ]

0 голосов
/ 03 марта 2019

Присоединяйтесь к столам и затем ранжируйте.select discordid, RANK() OVER<br> (PARTITION BY u.userid ORDER BY (the column that you are ranking from) DESC) AS Rank from otherqueryresult as q inner join user as u on u.id=q.userid

0 голосов
/ 03 марта 2019

Вы можете выполнить расчет напрямую.

Я думаю, что вы хотите:

select 1 + count(*)
from users u
where u.power > (select u2.power from users u2 where u2.discordID = ?);

Для этого вам не нужны оконные функции.С индексами на (discordId, power) и (power) это должно иметь очень очень хорошую производительность.

0 голосов
/ 03 марта 2019

Вы, похоже, ищете оконную функцию, такую ​​как RANK():

SELECT * 
FROM (SELECT u.*, RANK() OVER(ORDER BY power DESC) rnk FROM users u) x 
WHERE discordID = ?

Внутренний запрос назначает ранг каждому пользователю, причем пользователь, имеющий наивысший power, занимает первое место.Затем внешний запрос фильтрует пользователя, у которого есть соответствующие discordID.

. Существуют другие оконные функции, которые могут реагировать на ваш вариант использования:

  • ROW_NUMBER(): присваивает ранг каждой записи;четные записи обрабатываются непоследовательно

  • RANK(): четные записи получают одинаковый ранг;если два пользователя имеют ранг 1, то следующий пользователь имеет ранг 3

  • DENSE_RANK(): то же, что и RANK(), но не создает пробелов в рядах

...