Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Existe uma técnica SQL para ordenar combinando vários critérios?


Se entendi corretamente, parece que você pode usar expressões em seu ORDER BY , de maneira semelhante à resposta aceita dada à seguinte postagem do Stack Overflow:

Portanto, sua consulta pode ficar assim:
SELECT    imageID
FROM      ...
JOIN      ...
WHERE     designID = 100          
ORDER BY  garmentID = 1 DESC,
          colorID = 5 DESC,
          sizeID = 10 DESC;

Observe que garmentID , colorID e sizeID não são usados ​​como filtros no WHERE cláusula. Os valores são usados ​​apenas no ORDER BY expressões.

Caso de teste:
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 como a linha que corresponde ao garmentID especificado , colorID e sizeID é primeiro. Caso contrário, as linhas que correspondem a garmentID e colorID são os próximos. Em seguida, as linhas que correspondem apenas a garmentID Segue. Em seguida, o resto, que corresponde apenas ao designID filtro do WHERE cláusula.

Acredito que vale a pena fazer isso em SQL. Como @Toby anotado na outra resposta , em geral, você não precisa se preocupar com o desempenho ao classificar um número tão pequeno de linhas, supondo que sempre estará filtrando por designID ... Quanto à sua outra pergunta, não sei se existe um nome para essa consulta - costumo chamá-la de "ordenar por uma expressão".