Mysql
 sql >> Database >  >> RDS >> Mysql

Esiste una tecnica SQL per ordinare in base a più criteri?

Se ho capito bene, sembra che tu possa usare espressioni nel tuo ORDER BY , in modo simile alla risposta accettata data al seguente post di Stack Overflow:

Pertanto, la tua query potrebbe essere simile a questa:

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

Nota che garmentID , colorID e sizeID non vengono utilizzati come filtri in WHERE clausola. I valori vengono utilizzati solo in ORDER BY espressioni.

Caso di prova:

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

Risultato:

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)

Nota come la riga che corrisponde al garmentID specificato , colorID e sizeID è il primo. In caso contrario, le righe che corrispondono a garmentID e colorID sono i prossimi. Quindi le righe che corrispondono solo a garmentID Seguire. Poi il resto, che corrisponde solo al designID filtro del WHERE clausola.

Credo che valga la pena farlo in SQL. Come @Toby ha notato nell'altra risposta , in generale non devi preoccuparti delle prestazioni quando ordini un numero così piccolo di righe, supponendo che filtrerai sempre per designID ... Per quanto riguarda l'altra tua domanda, non so se esiste un nome per una query del genere:tendo a chiamarla "ordinare in base a un'espressione".