Mysql
 sql >> Base de données >  >> RDS >> Mysql

Existe-t-il une technique SQL pour ordonner en faisant correspondre plusieurs critères ?

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".