Om jag förstått det rätt ser det ut som att du kan använda uttryck i din ORDER BY , på ett sätt som liknar det accepterade svaret på följande Stack Overflow-inlägg:
Därför kan din fråga se ut så här:
SELECT imageID
FROM ...
JOIN ...
WHERE designID = 100
ORDER BY garmentID = 1 DESC,
colorID = 5 DESC,
sizeID = 10 DESC;
Observera att garmentID , colorID och sizeID används inte som filter i WHERE klausul. Värdena används endast i ORDER BY uttryck.
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);
Resultat:
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)
Notera hur raden som matchar det angivna garmentID , colorID och sizeID är först. Om det misslyckas, raderna som matchar garmentID och colorID är nästa. Sedan raderna som bara matchar garmentID Följ. Sedan resten, som bara matchar designID filter för WHERE klausul.
Jag tror att det är värt att göra detta i SQL. Som @Toby noterade i det andra svaret
, i allmänhet behöver du inte oroa dig för prestanda när du sorterar ett så litet antal rader, förutsatt att du alltid kommer att filtrera efter designID ... När det gäller din andra fråga, jag vet inte om det finns ett namn för en sådan fråga - jag brukar kalla det "ordna efter ett uttryck".