Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Czy istnieje technika SQL do zamawiania według wielu kryteriów?

Jeśli dobrze zrozumiałem, wygląda na to, że możesz używać wyrażeń w swoim ORDER BY , w sposób podobny do przyjętej odpowiedzi udzielonej w następującym poście Stack Overflow:

Dlatego Twoje zapytanie może wyglądać tak:

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

Zwróć uwagę, że garmentID , colorID i sizeID nie są używane jako filtry w WHERE klauzula. Wartości są używane tylko w ORDER BY wyrażenia.

Przypadek testowy:

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

Wynik:

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)

Zwróć uwagę, jak wiersz pasujący do określonego garmentID , colorID i sizeID jest pierwszy. Jeśli to się nie uda, wiersze pasujące do garmentID i colorID są następne. Następnie wiersze, które pasują tylko do garmentID śledzić. Potem reszta, która pasuje tylko do designID filtr WHERE klauzula.

Uważam, że warto to robić w SQL. Jako @Toby zauważył w drugiej odpowiedzi , generalnie nie musisz martwić się o wydajność podczas sortowania tak małej liczby wierszy, zakładając, że zawsze będziesz filtrować według designID ... Jeśli chodzi o twoje drugie pytanie, nie wiem, czy istnieje nazwa dla takiego zapytania - zwykle nazywam to "uporządkowaniem według wyrażenia".



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak dodać mode=mysql do wbudowanej bazy danych H2 w Spring Boot 1.4.1 dla @DataJpaTest?

  2. Znajdowanie zduplikowanych wartości w MySQL

  3. Problemy ze sterownikiem MySQL

  4. Czy mam mysql_real_escape_string hasło wpisane w formularzu rejestracyjnym?

  5. Jak podzielić ciąg nazwy w mysql?