Задать вопрос
Akuma
@Akuma
Веб-программист

MySQL: Узнать количество "пройденных" SELECT`ом строк

Добрый вечер.

Допустим есть табличка:

CREATE TABLE `mytable` (
`id` int(11) NOT NULL auto_increment,
`system_name` varchar(100) NOT NULL,
`name` varchar(100) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM ;


И есть простенький запрос:
SELECT * FROM `mytable` WHERE `system_name` = 'element_10' ORDER BY `id`

Как получить количество (именно количество, содержимое не важно) строк, которые команда «прошла» до того как получила результат?

Т.е. нечто вроде:
SELECT @id := `id` FROM `mytable` WHERE `system_name` = 'element_10' LIMIT 1;
SELECT * FROM `mytable` WHERE `id` < @id ORDER BY `id`

Но при этом нужно уложиться в один запрос. Смысл именно в выборке по полю типа VARCHAR, при сортировке по другому плю типа INT.
  • Вопрос задан
  • 4552 просмотра
Подписаться 3 Оценить Комментировать
Пригласить эксперта
Ответы на вопрос 5
knekrasov
@knekrasov
Постановка вопроса несколько странная. По-моему РСУБД никогда не скажет, сколько строк она обработала до получения результата. Более того, «маршрут сканирования» и его порядок в разных условиях будет разным.
Ответ написан
@edogs
habrahabr.ru/blogs/mysql/130905/ читать начиная с «Считаем количества прочитанных строк»
Ответ написан
Комментировать
taliban
@taliban
php программист
Только написать процедуру. Там у Вас будет указатель на конкретную строку в которой ща мускул.
Ответ написан
Maximus43
@Maximus43
Если поле system_name в индекс не попадает, то такой запрос будет full scan, т.е. будет пройдено 100% записей в таблице. Посчитать количество записей в таблице можно с помощью оператора count.
Ответ написан
Комментировать
@egorinsk
> И есть простенький запрос:
> SELECT * FROM `mytable` WHERE `system_name` = 'element_10' ORDER BY `id`

> Как получить количество (именно количество, содержимое не важно) строк, которые команда «прошла» до того как получила результат?

Ваш вопрос некорректен. Вы думаете, MySQL всегда передирает все строки подряд? Если бы на поле system_name был индекс, MySQL выбрала бы эту строчку с первого раза, не проходя другие.

Наверно, вы хотели спросить, как посчитать, сколько существует строк, у которых id меньше чем у найденной? Это можно сделат запросом

SELECT COUNT(*) FROM mytable WHERE id < {id найденной строки}

Этот запрос неэффективен, особенно на больших таблицах, потому в случае потребности в нем (например, надо считать на каком месте игрок с заданным числом очков) делают дополнительное поле position, и крон скриптом раз в N минут пересчитывают места. Процесс пересчета можно как-то оптимизировать, сохраняя информацию о вставках и удалениях в таблице.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы