Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Gibt es eine SQL-Technik zum Bestellen nach Abgleich mehrerer Kriterien?

Wenn ich das richtig verstanden habe, sieht es so aus, als könnten Sie Ausdrücke in Ihrem ORDER BY verwenden , ähnlich wie die akzeptierte Antwort auf den folgenden Stack Overflow-Beitrag:

Daher könnte Ihre Abfrage folgendermaßen aussehen:

SELECT    imageID
FROM      ...
JOIN      ...
WHERE     designID = 100          
ORDER BY  garmentID = 1 DESC,
          colorID = 5 DESC,
          sizeID = 10 DESC;

Beachten Sie, dass garmentID , colorID , und sizeID werden nicht als Filter im WHERE verwendet Klausel. Die Werte werden nur im ORDER BY verwendet Ausdrücke.

Testfall:

CREATE TABLE designs (designID int, garmentID int, colorID int, sizeID int);

INSERT INTO designs VALUES (100, 1, 1, 1);
INSERT INTO designs VALUES (100, 1, 2, 2);
INSERT INTO designs VALUES (100, 1, 5, 3);
INSERT INTO designs VALUES (100, 1, 5, 10);
INSERT INTO designs VALUES (100, 1, 5, 15);
INSERT INTO designs VALUES (100, 1, 8, 20);
INSERT INTO designs VALUES (100, 2, 5, 10);
INSERT INTO designs VALUES (100, 2, 6, 15);
INSERT INTO designs VALUES (101, 1, 1, 1);
INSERT INTO designs VALUES (101, 2, 1, 1);

Ergebnis:

SELECT    * 
FROM      designs 
WHERE     designID = 100 
ORDER BY  garmentID = 1 DESC, 
          colorID = 5 DESC, 
          sizeID = 10 DESC;

+----------+-----------+---------+--------+
| designID | garmentID | colorID | sizeID |
+----------+-----------+---------+--------+
|      100 |         1 |       5 |     10 |
|      100 |         1 |       5 |      3 |
|      100 |         1 |       5 |     15 |
|      100 |         1 |       1 |      1 |
|      100 |         1 |       2 |      2 |
|      100 |         1 |       8 |     20 |
|      100 |         2 |       5 |     10 |
|      100 |         2 |       6 |     15 |
+----------+-----------+---------+--------+
8 rows in set (0.02 sec)

Beachten Sie, wie die Zeile, die mit der angegebenen garmentID übereinstimmt , colorID und sizeID ist zuerst. Andernfalls die Zeilen, die mit garmentID übereinstimmen und colorID sind die nächsten. Dann die Zeilen, die nur mit garmentID übereinstimmen Folgen. Dann der Rest, der nur mit der designID übereinstimmt Filter des WHERE Klausel.

Ich glaube, es lohnt sich, dies in SQL zu tun. Als @Toby in der anderen Antwort vermerkt , müssen Sie sich im Allgemeinen keine Gedanken über die Leistung machen, wenn Sie eine so kleine Anzahl von Zeilen sortieren, vorausgesetzt, Sie filtern immer nach designID ... Was Ihre andere Frage betrifft, ich weiß nicht, ob es einen Namen für eine solche Abfrage gibt - ich nenne sie eher "Ordnen nach einem Ausdruck".