Техника Pure-SQL для автоматической нумерации строк в наборе результатов - PullRequest
5 голосов
/ 14 октября 2008

Я ищу способ последовательного нумерации строк в наборе результатов (не в таблице). По сути, я начинаю с запроса, подобного следующему:

SELECT id, name FROM people WHERE name = 'Spiewak'

id s, очевидно, не являются истинной последовательностью (например, 1, 2, 3, 4). Что мне нужно, это еще один столбец в наборе результатов, который содержит эти авто нумерации. Я готов использовать функцию SQL, если мне нужно, но я бы предпочел сделать это без использования расширений спецификации ANSI.

Платформа - это MySQL, но метод должен быть кросс-платформенным, если это вообще возможно (отсюда и желание избегать нестандартных расширений).

Ответы [ 9 ]

9 голосов
/ 14 октября 2008

AFAIK, нет "стандартного" способа.

В MS SQL Server есть row_number (), которого нет в MySQL.

Самый простой способ сделать это в MySQL - это

SELECT a.*, @num := @num + 1 b from test a, (SELECT @num := 0) d;

Источник: комментарии в http://www.xaprb.com/blog/2006/12/02/how-to-number-rows-in-mysql/

9 голосов
/ 14 октября 2008

Чтобы иметь значимый номер строки, вам нужно упорядочить результаты. Тогда вы можете сделать что-то вроде этого:

SELECT id, name
    , (SELECT COUNT(*) FROM people p2 WHERE name='Spiewak' AND p2.id <= p1.id) AS RowNumber
FROM people p1
WHERE name = 'Spiewak'
ORDER BY id

Обратите внимание, что предложение WHERE подзапроса должно соответствовать предложению WHERE или первичному ключу из основного запроса и ORDER BY основного запроса.

SQL Server имеет конструкцию ROW_NUMBER () OVER, чтобы упростить это, но я не знаю, есть ли в MySQL что-то особенное для ее решения.


Поскольку мой пост был принят в качестве ответа, я хочу также вызвать ответ Дана Голдштейна, который очень похож по подходу, но использует JOIN вместо подзапроса и часто будет работать лучше

8 голосов
/ 14 октября 2008

Одной из идей, которая довольно неэффективна, но является ANSI SQL, было бы подсчет количества строк с меньшим идентификатором, соответствующим тем же критериям. Я не проверял этот SQL, и он, вероятно, не будет работать, но что-то вроде:

SELECT id, name, sub.lcount
FROM people outer
JOIN (SELECT id, COUNT(id) lcount FROM people WHERE name = 'Spiewak' AND id < outer.id GROUP BY id) sub on outer.id = sub.id
WHERE name = 'Spiewak'
2 голосов
/ 08 ноября 2011

В oracle единственная база данных, которую я знаю, что вы хотели бы сделать, это сделать дополнительный выбор на данных

т.е.

select rownum, id , blah, blah
from  (
select id, name FROM people WHERE name = 'Spiewak'
)

основная концепция заключается в том, что значение rownum будет оцениваться по набору результатов, возвращенному из внутреннего выбора.

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

2 голосов
/ 12 августа 2010
SELECT @i:=@i+1 AS iterator, t.*
FROM tablename t,(SELECT @i:=0) foo
2 голосов
/ 14 октября 2008

Эта страница должна дать вам стандартный способ SQL сделать это:

http://www.sqlteam.com/article/returning-a-row-number-in-a-query

Надеюсь, это поможет.

2 голосов
/ 14 октября 2008

Не существует ANSI-стандартного способа сделать это, о котором я знаю.

В SQL Server имеется функция ROW_NUMBER (), которую можно использовать, а в Oracle - псевдостолбец ROWNUM.

В MySQL есть эта техника

1 голос
/ 22 мая 2013

Я знаю, что это старая ветка, но я только сейчас искал этот ответ. Я пробовал запрос Дана Голдштейна в MySQL, но он не работал так, как написано, потому что «внешний» - зарезервированное слово. Затем я заметил, что он все еще использует подзапрос, в любом случае.

Итак, я выяснил версию, используя JOIN, но никакого подзапроса:

  SELECT SUM(IF(p1.id > p2.id, 0, 1)) AS `row`, p2.id, p2.name
  FROM people p1 JOIN people p2 ON p1.name = p2.name
  WHERE p1.name = 'Spiewak'
  GROUP BY p2.id

Это сработало для меня в MySQL 5.1. Для MySQL, кажется, достаточно для GROUP BY p2.id. Явный ORDER BY p2.id может быть добавлен в конец запроса, но в любом случае я получил те же результаты.

0 голосов
/ 14 октября 2008

Для сервера SQL проверьте функцию RANK.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...