2009-07-08 69 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 

但我懷疑這會以某種方式非常有效,不僅因爲查詢無法使用查詢緩存。