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