mysql - SQL排名解决方案

标签 mysql

我正在为我的一个表实现排名解决方案,以优化读取查询以摆脱使用 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;

我希望该选择查询获取所有 acl 行并同时将它们与引号行连接起来,设置它们的位置,但我得到的只是每一行的 position=1。有人建议我将变量赋值移动到 JOIN 或 ORDER 子句,但问题仍然存在。我的问题是...如何在单个查询中分配位置?

最佳答案

我博客文章中的一个稍微修改过的查询:

SELECT  q.*,
        @r := @r + 1
FROM    (
        SELECT  @_acl_id := -1,
                @r := 0
        ) vars
STRAIGHT_JOIN
        (
        SELECT  acl.id AS acl_id, quote.id AS quote_id
        FROM    acl
        JOIN    quote
        ON      (acl.limiter IS NULL OR quote.reputation >= acl.limiter)
        ORDER BY
                acl.id ASC, quote.created_at DESC
        ) q
WHERE   CASE WHEN @_acl_id <> acl_id THEN @r := 0 ELSE 0 END IS NOT NULL
        AND (@_acl_id := acl_id) IS NOT NULL

关于mysql - SQL排名解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1043340/

相关文章:

php - 在 MySQL 数据库字段中搜索多个文本

php - 使用 phpmyadmin 导入时如何忽略双引号?

mysql - 检查是否有新行添加到 DataGridView

MYSQL - 使用分隔符格式化名称字符串

php - 在表的不同字段中插入特定元素

MySQL 插入循环

mysql - 无法创建表 errno150

mysql - 如何从 MySQL 中的查询中获取所有数据?

Mysql循环触发器

java - 从 Java 在 MySQL 中记录 utf-8 字符串时出现问题