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".