sql >> Base de Datos >  >> RDS >> Mysql

¿Existe una técnica SQL para ordenar haciendo coincidir múltiples criterios?

Si entendí bien, parece que puedes usar expresiones en tu ORDER BY , de manera similar a la respuesta aceptada dada a la siguiente publicación de desbordamiento de pila:

Por lo tanto, su consulta podría verse así:

SELECT    imageID
FROM      ...
JOIN      ...
WHERE     designID = 100          
ORDER BY  garmentID = 1 DESC,
          colorID = 5 DESC,
          sizeID = 10 DESC;

Tenga en cuenta que garmentID , colorID y sizeID no se utilizan como filtros en WHERE cláusula. Los valores solo se usan en el ORDER BY expresiones.

Caso de prueba:

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);

Resultado:

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)

Observe cómo la fila que coincide con el garmentID especificado , colorID y sizeID es primero. En su defecto, las filas que coincidan con garmentID y colorID son los siguientes Luego, las filas que solo coinciden con garmentID seguir. Luego el resto, que solo coincide con el designID filtro del WHERE cláusula.

Creo que vale la pena hacer esto en SQL. Como @Toby señaló en la otra respuesta , en general, no necesita preocuparse por el rendimiento al ordenar un número tan pequeño de filas, suponiendo que siempre filtrará por designID ... En cuanto a su otra pregunta, no sé si existe un nombre para esa consulta; tiendo a llamarlo "ordenar por una expresión".