Jeśli dobrze zrozumiałem, wygląda na to, że możesz używać wyrażeń w swoim ORDER BY
, w sposób podobny do przyjętej odpowiedzi udzielonej w następującym poście Stack Overflow:
Dlatego Twoje zapytanie może wyglądać tak:
SELECT imageID
FROM ...
JOIN ...
WHERE designID = 100
ORDER BY garmentID = 1 DESC,
colorID = 5 DESC,
sizeID = 10 DESC;
Zwróć uwagę, że garmentID
, colorID
i sizeID
nie są używane jako filtry w WHERE
klauzula. Wartości są używane tylko w ORDER BY
wyrażenia.
Przypadek testowy:
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);
Wynik:
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)
Zwróć uwagę, jak wiersz pasujący do określonego garmentID
, colorID
i sizeID
jest pierwszy. Jeśli to się nie uda, wiersze pasujące do garmentID
i colorID
są następne. Następnie wiersze, które pasują tylko do garmentID
śledzić. Potem reszta, która pasuje tylko do designID
filtr WHERE
klauzula.
Uważam, że warto to robić w SQL. Jako @Toby zauważył w drugiej odpowiedzi
, generalnie nie musisz martwić się o wydajność podczas sortowania tak małej liczby wierszy, zakładając, że zawsze będziesz filtrować według designID
... Jeśli chodzi o twoje drugie pytanie, nie wiem, czy istnieje nazwa dla takiego zapytania - zwykle nazywam to "uporządkowaniem według wyrażenia".