Я внедряю решение ранжирования для одной из моих таблиц, чтобы оптимизировать запросы на чтение, чтобы избавиться от дорогих запросов, в которых используются предложения COUNT (*), LIMIT и OFFSET. Моя проблема в том, что я не знаю, почему расчет позиции неверен. Пожалуйста, посмотрите на мой пример, чтобы воспроизвести проблему.
CREATE TABLE `acl`
(
`id` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
`name` VARCHAR(32) NOT NULL,
`limiter` INTEGER(11) SIGNED NULL,
PRIMARY KEY (`id`)
)
ENGINE=INNODB;
CREATE TABLE `quote`
(
`id` MEDIUMINT(8) UNSIGNED NOT NULL AUTO_INCREMENT,
`created_at` INTEGER(11) UNSIGNED NOT NULL,
`reputation` INTEGER(11) SIGNED NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE=INNODB;
INSERT INTO `acl` (`name`, `limiter`) VALUES ('Users', 0), ('Staff', null);
INSERT INTO `quote` (`created_at`, `reputation`)
VALUES (UNIX_TIMESTAMP(), 0), (UNIX_TIMESTAMP()+1, 0);
SET @acl_id := 0, @position := 0;
SELECT acl.id AS acl_id, quote.id AS quote_id,
GREATEST(@position := IF(@acl_id = acl.id, @position + 1, 1),
LEAST(0, @acl_id := acl.id)) AS position
FROM acl JOIN quote
ON (acl.limiter IS NULL OR quote.reputation >= acl.limiter)
ORDER BY acl.id ASC, quote.created_at DESC;
Мне бы хотелось, чтобы запрос select выбрал все строки acl и одновременно соединил их со строками кавычек, установил их позицию, но все, что я получил, это position = 1 для каждой строки. Кто-то предложил мне перенести присваивание переменных в предложение JOIN или ORDER, но проблема остается. У меня вопрос ... как назначить позицию в одном запросе?