2009-07-08 3 views
0

Ich habe eine Tabelle von Elementen. Artikel hat id, erzielt 1, Partitur 2.Mysql - Bestellung von 2 Rängen

I 12 bekannte Elemente auswählen möchten (mit WHERE id IN (....)) und um sie durch eine Kerbe, die die Summe von SCORE1 und der SCORE2 Reihen. Rang ist der Ort der Punktzahl, wenn die 12 Artikel von ihm bestellt wurden.

Wie kann ich das in mysql tun?

Edit:

Nach 4 Antworten, die ich sehe, dass die Lösung wahrscheinlich komplizierter ist, als ich erwartet hatte. Lass mich die Frage auf andere Weise stellen.

Wenn ich select *, [calculation] from table where id IN (odered list of ids) verwende. Kann ich irgendwie die Position jeder ID in der ursprünglichen geordneten Liste von IDs in [calculation] verwenden?

Antwort

2

aus meinem Kopf:

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 

Habe ich das richtig verstanden, Ihre Anfrage?

+0

Danke! Es tut definitiv, was ich will, aber ich brauche den effizientesten Weg, das zu tun. – Nir

+0

Für MySQL weiß ich nicht, wie man es in einer Abfrage macht, da ich mehr an MSSQL gewöhnt bin. Sie könnten dies in eine gespeicherte Prozedur einfügen oder möglicherweise anstelle der ersten zwei Einfügungen Ansichten erstellen. Wenn Sie nach Effizienz suchen, dann überdenken Sie die Verwendung der IN() -Klausel zu ... – Brimstedt

0

Ist das, was Sie suchen zu tun?

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

Nein. Ich brauche die Summe der Ränge der Scores (ihre Position, wenn vom größten zum kleinsten sortiert), nicht die Scores selbst. – Nir

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 

Aber ich bezweifle, dass dies irgendwie sehr effizient sein wird, nicht nur, weil die Abfrage nicht die Verwendung der Abfrage-Cache machen.