Ако разбрах правилно, изглежда, че можете да използвате изрази във вашия ORDER BY
, по начин, подобен на приетия отговор, даден на следната публикация за препълване на стека:
Следователно вашата заявка може да изглежда така:
SELECT imageID
FROM ...
JOIN ...
WHERE designID = 100
ORDER BY garmentID = 1 DESC,
colorID = 5 DESC,
sizeID = 10 DESC;
Обърнете внимание, че garmentID
, colorID
и sizeID
не се използват като филтри в WHERE
клауза. Стойностите се използват само в ORDER BY
изрази.
Тестов случай:
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);
Резултат:
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)
Обърнете внимание как редът, който съответства на посочения garmentID
, colorID
и sizeID
е първо. Ако това не стане, редовете, които съответстват на garmentID
и colorID
са следващите. След това редовете, които съвпадат само с garmentID
последвам. След това останалите, които съвпадат само с designID
филтър на WHERE
клауза.