2013-05-05 4 views
4

Возможно ли получить номер строки в MySQL? Скажем, у меня есть «стол»Номер строки в mySQL

ID tag name 
1 A alpha 
4 B beta 
5 C gamma 
8 D ceta 

Как я могу получить в MySQL, что, например, «C» является третьей строки в этой таблице? Последующие:

SET @pos=0; 
SELECT @pos:[email protected]+1,tag FROM table ORDER BY tag ASC; 

подсчитывает строки как следует. Но (извините за невежественный код)

SET @pos=0; 
SELECT @pos:[email protected]+1,tag FROM table where tag='C' ORDER BY tag ASC; 

дает 1 строку как результат, с позами как 0, так как это, вероятно, следует.

Есть ли способ получить «pos» как «3», как мне это нужно? (Заказ будет иметь важное значение, а также, является ли это отношение к вопросу или нет ..)

+0

[Как узнать номер строки определенной строки в MySql?] (Http://stackoverflow.com/q/10765746/1037210). Неотвеченный вопрос, но он содержит SQL-запрос, чтобы получить номер строки определенной строки. – Lion

+1

Таблицы не имеют номеров строк, поскольку на самом деле они не имеют порядка. В реальном мире, конечно, строки помещаются на жестком диске в некотором порядке, но это не должно означать ничего. Если вам нужны упорядоченные номера, они должны либо быть в столбце для этой цели, либо подчиняться деталям вашего предложения ORDER BY. – siride

+0

Возможно, я просто неправильно понимаю вопрос, но что было бы неправильно с добавлением LIMIT 1 OFFSET 3 в существующий SELECT? Кстати, «номер строки» в этом случае является артефактом вашего предложения ORDER BY. Кажется, вы запрашиваете одно смещение элемента от начала ваших результатов запроса тремя (или, может быть, двумя, я не уверен). –

ответ

1

В случае, если ваши идентификаторы строго возрастают с номерами строк, вы можете сделать

SELECT COUNT(*) FROM tbl WHERE ID <= (SELECT ID FROM tbl WHERE tag = 'C'); 

Я не уверен, что вы имеете в виду при заказе.

Side Примечание: Ваш код

SET @pos=0; 
SELECT @pos:[email protected]+1,tag FROM tbl where tag='C' ORDER BY tag ASC; 

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

+0

Как ни странно, он работает .. :) Он возвращает одну запись с pos = 0 – Konservin

+0

Я имел в виду не то, что ваш код ничего не делает. Я имел в виду, что он не возвращается с номером 3, который вы хотите получить. Но Видите, что вы довольны ответом Дани Y. Поэтому я думаю, что ваша проблема решена. – luksch

3

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

Select rownum from (
SELECT @rownum:[email protected]+1 rownum, t.*FROM (SELECT @rownum:=0) r, table t order by tag) as t1 
where tag = 'C' 
+0

Спасибо, Дани, это на самом деле работает ** отлично ** judgung путем быстрого тестирования. «C» - 3 каждый раз. Что мешает мне отмечать это, так как ответ - комментарий Сириды. Может ли быть какая-то проблема? – Konservin

+0

@ Консервин: здесь нет ничего плохого. Это допустимый способ создания динамического числа строк для определенного набора результатов. Пока вы в порядке с этим, тогда это прекрасный ответ (или мое предложение добавить столбец с постоянным заказом). Обратите внимание, однако, что если вы вставляете любые строки между, скажем, B и C, нумерация изменится с этим запросом. – siride

+1

@ Konservin, чтобы объяснить далее, @siride прав, нет номеров строк для запросов, но то, что здесь происходит, заключается в том, что вручную мы добавляем столбец, который будет содержать номер строки, и мы увеличиваем его для каждой строки '@rownum: = @ rownum + 1' и вызывает этот столбец rownum. Затем мы выбираем из этой таблицы, которая содержит номер строки (который мы сделали) –

0

На самом деле, есть одна возможность, что я не считал раньше:

SELECT count(1) FROM table WHERE tag <= 'C' ORDER BY tag 

Это, кажется, делает то же самое, и немного быстрее, тоже. Или я чего-то не хватает?

+0

, это то же самое решение, что и мое, только теперь вы полагаетесь на упорядочение тега. Я думал, что вы хотите сохранить первоначальный заказ по id. – luksch

+0

Да, я вижу это сейчас. Извините за то, что вы больше не заглядываете в свой ответ. + many :) – Konservin

+0

Нет проблем. Как я уже сказал, я рад, что ваша проблема, похоже, решена. – luksch

Смежные вопросы