【发布时间】:2011-12-12 01:10:07
【问题描述】:
我在运行查询排名时遇到问题。 内部 SELECT 按排名顺序给出行,对于每一行,变量@rank 增加,如果不是等于先前排名的位置。 但@rank 并不是真正正确的位置。
我正在尝试按价值最高的人进行分组和排序。
SET @prev := NULL;
SET @curr := NULL;
SET @rank := 0;
SELECT
@prev := @curr,
@curr := SUM( a.value ) AS SUM_VALUES,
@rank := IF(@prev = @curr, @rank, @rank+1) AS rank,
b.id AS b_id,
b.name AS b_nome
FROM
a INNER JOIN b ON ( a.b_id = b.id )
GROUP BY b.id
ORDER BY SUM_VALUES DESC;
结果:
----------------------------------------------------
@prev := @curr | SUM_VALUES | rank | b_id | b_nome
---------------|------------|------|-------|--------
NULL | 10 | 2 | 2 | BBB
NULL | 2 | 1 | 1 | AAA
这里BBB是排名第一,AAA排名第二。 但这并没有发生,一个想法发生了什么?
测试转储
CREATE TABLE `a` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`b_id` INT(10) NULL DEFAULT NULL,
`value` INT(10) NULL DEFAULT NULL,
`name` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`id`),
INDEX `b_id` (`b_id`),
CONSTRAINT `fk_b` FOREIGN KEY (`b_id`) REFERENCES `b` (`id`)
)
ENGINE=InnoDB;
CREATE TABLE `b` (
`id` INT(10) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(50) NULL DEFAULT NULL,
PRIMARY KEY (`id`)
)
ENGINE=InnoDB;
INSERT INTO `b` (`id`, `name`) VALUES (1, 'AAA');
INSERT INTO `b` (`id`, `name`) VALUES (2, 'BBB');
INSERT INTO `a` (`id`, `b_id`, `value`, `name`) VALUES (1, 1, 2, 'smaller');
INSERT INTO `a` (`id`, `b_id`, `value`, `name`) VALUES (2, 2, 10, 'bigger');
【问题讨论】:
-
您想要的结果是什么?这还不是很清楚。它还可以帮助将您的示例简化为一个非常简单的数据集,该数据集可以演示您的问题,而没有一堆与问题无关的表、列和过滤器。这个问题有太多要处理的问题,这可能是您没有得到任何回复的原因。