Pokud jsem to správně pochopil, vypadá to, že ve svém ORDER BY
můžete používat výrazy , způsobem podobným přijaté odpovědi uvedené v následujícím příspěvku Stack Overflow:
Váš dotaz tedy může vypadat takto:
SELECT imageID
FROM ...
JOIN ...
WHERE designID = 100
ORDER BY garmentID = 1 DESC,
colorID = 5 DESC,
sizeID = 10 DESC;
Všimněte si, že garmentID
, colorID
a sizeID
se nepoužívají jako filtry v WHERE
doložka. Hodnoty se používají pouze v ORDER BY
výrazy.
Testovací případ:
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);
Výsledek:
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)
Všimněte si, jak řádek odpovídá zadanému garmentID
, colorID
a sizeID
je první. Pokud se tak nestane, řádky, které odpovídají garmentID
a colorID
jsou další. Potom řádky, které odpovídají pouze garmentID
následovat. Potom zbytek, který odpovídá pouze designID
filtr WHERE
doložka.
Věřím, že to stojí za to udělat v SQL. Jako @Toby poznamenal v druhé odpovědi
, obecně se nemusíte starat o výkon při řazení tak malého počtu řádků, za předpokladu, že budete vždy filtrovat podle designID
... Pokud jde o vaši další otázku, nevím, zda existuje název pro takový dotaz - mám tendenci to nazývat "řazení podle výrazu".