Если я правильно понял, похоже, что вы можете использовать выражения в вашем 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
.
Я считаю, что это стоит делать в SQL. Как заметил @ Тоби в другом ответе , в общем случае вам не нужно беспокоиться о производительности при сортировке такого небольшого количества строк, при условии, что вы всегда будете фильтровать по designID
... Что касается Ваш другой вопрос, я не знаю, есть ли название для такого запроса - я склонен называть это «упорядочением по выражению».