Mysql - порядок на 2 ранга

У меня есть таблица предметов. у предмета есть идентификатор, оценка 1, оценка 2.

Я хочу выбрать 12 известных элементов (используя WHERE id IN (....)) и упорядочить их по баллу, который является суммой рангов для score1 и score2. ранг - это расположение партитуры, если 12 элементов были упорядочены ею.

Как я могу сделать это в mysql?

Изменить:

После 4 ответов я вижу, что решение, вероятно, сложнее, чем я ожидал. поэтому позвольте мне задать вопрос по-другому.

Если я использую select *, [calculation] from table where id IN (odered list of ids). Могу ли я как-то использовать положение каждого идентификатора в исходном упорядоченном списке идентификаторов в [calculation]?


person Nir    schedule 08.07.2009    source источник


Ответы (3)


Выйди с моей головы:

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

Я правильно понял вашу просьбу?

person Brimstedt    schedule 08.07.2009
comment
Спасибо! Он определенно делает то, что я хочу, но мне нужен самый эффективный способ сделать это. - person Nir; 08.07.2009
comment
Для MySQL я не знаю, как это сделать в одном запросе, так как я больше привык к MSSQL. Вы можете поместить это в хранимую процедуру или, возможно, создать представления вместо первых двух вставок. Если вы ищете эффективность, подумайте также об использовании предложения IN()... - person Brimstedt; 08.07.2009

Это то, что вы хотите сделать?

SELECT
(CAST(score1 AS INT) + CAST(score2 AS INT)) AS rank
FROM items
WHERE id IN(...)
ORDER BY rank DESC
person Josh    schedule 08.07.2009
comment
Нет. Мне нужна сумма рангов баллов (их расположение при сортировке от большего к меньшему), а не сами баллы. - person Nir; 08.07.2009

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

Но я сомневаюсь, что это будет как-то очень эффективно не только потому, что запрос не может использовать кеш запроса.

person Stefan Gehrig    schedule 08.07.2009