Solución de clasificación SQL

Estoy implementando una solución de clasificación para una de mis tablas para optimizar las consultas de lectura y deshacerme de las consultas costosas que utilizan las cláusulas COUNT (*), LIMIT y OFFSET. Mi problema es que no sé por qué el cálculo de posición es incorrecto. Por favor mira mi ejemplo para reproducir el problema.

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;

Me gustaría que la consulta de selección buscara todas las filas de acl y las uniera con las filas de comillas al mismo tiempo, establezca su posición, pero todo lo que obtengo es position = 1 para cada fila. Alguien me sugirió mover las asignaciones de variables a la cláusula JOIN u ORDER, pero el problema continúa. Mi pregunta es ... ¿cómo asignar posición en una sola consulta?

Respuestas a la pregunta(2)

Su respuesta a la pregunta