0

我有一个项目表。item 有 id,得分 1,得分 2。

我想选择 12 个已知项目(使用WHERE id IN (....))并按 score1 和 score2 的排名之和对它们进行排序。如果 12 个项目是按它排序的,则排名是分数的位置。

我怎样才能在mysql中做到这一点?

编辑:

在 4 个答案之后,我发现解决方案可能比我预期的要复杂。所以让我换个方式问这个问题。

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

4

3 回答 3

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

我是否正确理解了您的要求?

于 2009-07-08T12:12:50.627 回答
0

这是你想要做的吗?

SELECT
(CAST(score1 AS INT) + CAST(score2 AS INT)) AS rank
FROM items
WHERE id IN(...)
ORDER BY rank DESC
于 2009-07-08T12:09:48.073 回答
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

但我怀疑这是否会非常有效,不仅因为查询不能使用查询缓存。

于 2009-07-08T12:21:55.403 回答