С MySQL, как я могу создать столбец, содержащий индекс записи в таблице?


есть ли способ получить фактический номер строки из запроса?

Я хочу иметь возможность заказать таблицу под названием league_girl по полю под названием score; и вернуть имя пользователя и фактическую позицию строки этого имени пользователя.

Я хочу ранжировать пользователей, чтобы я мог сказать, где находится конкретный пользователь, т. е. Джо занимает позицию 100 из 200, т. е.

User Score Row
Joe  100    1
Bob  50     2
Bill 10     3

Я видел несколько решений здесь, но я пробовал большинство из них, и ни один из них на самом деле не возвращает номер строки.

Я попытался это:

SELECT position, username, score
FROM (SELECT @row := @row + 1 AS position, username, score 
       FROM league_girl GROUP BY username ORDER BY score DESC) 

как производное

...но это, кажется, не возвращает позицию строки.

какие идеи?

7 96

7 ответов:

вы можете попробовать следующее:

SELECT  l.position, 
        l.username, 
        l.score,
        @curRow := @curRow + 1 AS row_number
FROM    league_girl l
JOIN    (SELECT @curRow := 0) r;

The JOIN (SELECT @curRow := 0) часть позволяет инициализацию переменной, не требуя отдельного

SELECT @i:=@i+1 AS iterator, t.*
FROM tablename t,(SELECT @i:=0) foo

вот структура шаблона, который я использовал:

  select
          /*this is a row number counter*/
          ( select @rownum := @rownum + 1 from ( select @rownum := 0 ) d2 ) 
          as rownumber,
          d3.*
  from 
  ( select d1.* from table_name d1 ) d3

и вот мой рабочий код:

select     
           ( select @rownum := @rownum + 1 from ( select @rownum := 0 ) d2 ) 
           as rownumber,
           d3.*
from
(   select     year( d1.date ), month( d1.date ), count( d1.id )
    from       maindatabase d1
    where      ( ( d1.date >= '2013-01-01' ) and ( d1.date <= '2014-12-31' ) )
    group by   YEAR( d1.date ), MONTH( d1.date ) ) d3

вы также можете использовать

SELECT @curRow := ifnull(@curRow,0) + 1 Row, ...

для инициализации переменной счетчика.

предполагая, что MySQL поддерживает его, вы можете легко сделать это со стандартным подзапросом SQL:

select 
    (count(*) from league_girl l1 where l2.score > l1.score and l1.id <> l2.id) as position,
    username,
    score
from league_girl l2
order by score;

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

Если вы просто хотите узнать положение одного конкретного пользователя после заказа по счету Поля, вы можете просто выбрать все строки из таблицы, где оценка поля выше, чем текущий счет пользователя. И используйте номер строки, возвращенный + 1, чтобы узнать, какая позиция этого текущего пользователя.

предполагая, что ваша таблица "league_girl" и Ваше основное поле "id", вы можете использовать это:

SELECT count(id) + 1 as rank from league_girl where score > <your_user_score>

Я знаю, что ОП просит mysql ответ, но так как я нашел другие ответы не работает для меня,

  • большинство из них терпят неудачу с order by
  • или они просто очень неэффективны и делают ваш запрос очень медленным для толстой таблицы

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

пример в PHP:

        $users = UserRepository::loadAllUsersAndSortByScore();

        foreach($users as $index=>&$user){
            $user['rank'] = $index+1;
        }

пример в PHP с использованием смещения и предел для подкачки:

        $limit = 20; //page size
        $offset = 3; //page number

        $users = UserRepository::loadAllUsersAndSortByScore();

        foreach($users as $index=>&$user){
            $user['rank'] = $index+1+($limit*($offset-1));
        }