С 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 ответов:
вы можете попробовать следующее:
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 /*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)); }