Определить позицию первого вхождения строки в MySQL? - PullRequest
0 голосов
/ 27 июля 2010

Для такой таблицы:

username        | time
---------------------------------------
animuson        | 0.678
aP*animuson     | 0.967
animuson        | 0.567
qykumsoy        | 0.876

Я пытаюсь найти способ в MySQL упорядочить их по времени, а затем найти позицию, в которой встречается имя пользователя, а имя пользователя считается только один раз.Итак, если я ищу имя пользователя 'qykumsoy', оно должно возвращать 2, потому что оба раза 'animuson' быстрее, но считается только самое быстрое, тогда 'qykumsoy' является следующим самым быстрым после этого.Я могу их сгруппировать и упорядочить, но как мне узнать, на какой позиции находится это имя пользователя?Я подумал, что делать это в MySQL может быть быстрее, чем перебирать все результаты в PHP, поправьте меня, если я ошибаюсь.

Что я думал до сих пор:

SELECT * FROM `times` ORDER BY MIN(`time`) GROUP BY `username`

У меня не очень хороший опыт работы с MySQL, только базовые вещи.Есть идеи?

1 Ответ

0 голосов
/ 27 июля 2010

Что вам нужно, так это ранжирование по отношению к данным в таблице - MySQL не имеет никакой функции ранжирования / аналитики / управления окнами, но у вас есть два варианта - это:

SELECT x.rank
   FROM (SELECT t.username, 
                         t.time,
                         (SELECT COUNT(*)
                              FROM TABLE y
                             WHERE y.time <= t.time) AS rank
                 FROM TABLE t) x
 WHERE x.username = 'qykumsoy'

... или с помощью переменной:

SELECT x.rank
   FROM (SELECT t.username, 
                         t.time,
                         @rownum := @rownum + 1 AS rank
               FROM TABLE t
                  JOIN (SELECT @rownum := 0) r
         ORDER BY t.time DESC) x
 WHERE x.username = 'qykumsoy'
...