Si j'ai bien compris, il semble que vous puissiez utiliser des expressions dans votre ORDER BY
, d'une manière similaire à la réponse acceptée donnée au post Stack Overflow suivant :
Par conséquent, votre requête pourrait ressembler à ceci :
SELECT imageID
FROM ...
JOIN ...
WHERE designID = 100
ORDER BY garmentID = 1 DESC,
colorID = 5 DESC,
sizeID = 10 DESC;
Notez que garmentID
, colorID
, et sizeID
ne sont pas utilisés comme filtres dans WHERE
clause. Les valeurs ne sont utilisées que dans le ORDER BY
expressions.
Scénario de test :
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);
Résultat :
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)
Notez comment la ligne qui correspond au garmentID
spécifié , colorID
et sizeID
est le premier. A défaut, les lignes qui correspondent à garmentID
et colorID
sont les prochains. Ensuite, les lignes qui correspondent uniquement à garmentID
suivre. Puis le reste, qui ne correspond qu'au designID
filtre du WHERE
clause.
Je pense que cela vaut la peine de le faire en SQL. Comme @Toby noté dans l'autre réponse
, en général, vous n'avez pas à vous soucier des performances lors du tri d'un si petit nombre de lignes, en supposant que vous filtrerez toujours par designID
... Quant à votre autre question, je ne sais pas s'il existe un nom pour une telle requête - j'ai tendance à l'appeler "ordre par une expression".