2009-07-08 106 views
0

我有一个项目表。项目都有编号,1分,比分2Mysql - 2秩序排序

我想通过一个分数,是score1和score2的行列的总和,选择12项已知(使用WHERE id IN (....))和命令他们。如果12个项目是由它定购的,排名是得分的位置。

我该如何在mysql中执行此操作?

编辑:

答案后4我看到的解决方案可能比我预期的复杂。所以让我以另一种方式提出这个问题。

如果我使用select *, [calculation] from table where id IN (odered list of ids)。我能以某种方式在[calculation]的原始有序ID列表中使用每个ID的位置吗?

回答

2

从我脑袋:

CREATE TEMPORARY TABLE t_1(score_1_rank INT AUTO_INCREMENT, id) 
CREATE TEMPORARY TABLE t_2(score_2_rank INT AUTO_INCREMENT, id) 

INSERT INTO t_1(id) 
SELECT id 
FROM items i 
WHERE id IN() 
ORDER BY score_1 

INSERT INTO t_2(id) 
SELECT id 
FROM items i 
WHERE id IN() 
ORDER BY score_2 

SELECT ... 
FROM items i 
INNER JOIN t_1 t1 
    ON t1.id = i.id 
INNER JOIN t_2 t2 
    ON t2.id = i.id 
ORDER BY t1.rank + t2.rank 

难道我明白你的要求是否正确?

+0

谢谢!它肯定做我想要的,但我需要最有效的方式来做到这一点。 – Nir 2009-07-08 12:16:09

0

这是你在做什么?

SELECT 
(CAST(score1 AS INT) + CAST(score2 AS INT)) AS rank 
FROM items 
WHERE id IN(...) 
ORDER BY rank DESC 
+0

不需要。我需要分数排名的总和(从最大到最小排序时的位置),而不是分数本身。 – Nir 2009-07-08 12:12:51

0
SELECT id, score1, score2, 
    r1.rank AS rank1, 
    r2.rank AS rank2, 
    (r1.rank + r2.rank) rankSum 
FROM items i 
INNER JOIN (
    SELECT @rank := @rank + 1 AS rank, id 
    FROM items, (SELECT @rank :=0) AS r 
    ORDER BY score1 
) AS r1 ON r1.id = i.id 
INNER JOIN (
    SELECT @rank := @rank + 1 AS rank, id 
    FROM items, (SELECT @rank :=0) AS r 
    ORDER BY score2 
) AS r2 ON r2.id = i.id 
ORDER BY rankSum 

但我怀疑这会以某种方式非常有效,不仅因为查询无法使用查询缓存。