sql >> Databáze >  >> RDS >> Mysql

Existuje technika SQL pro objednávání podle více kritérií?

Pokud jsem to správně pochopil, vypadá to, že ve svém ORDER BY můžete používat výrazy , způsobem podobným přijaté odpovědi uvedené v následujícím příspěvku Stack Overflow:

Váš dotaz tedy může vypadat takto:

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

Všimněte si, že garmentID , colorID a sizeID se nepoužívají jako filtry v WHERE doložka. Hodnoty se používají pouze v ORDER BY výrazy.

Testovací případ:

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

Výsledek:

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)

Všimněte si, jak řádek odpovídá zadanému garmentID , colorID a sizeID je první. Pokud se tak nestane, řádky, které odpovídají garmentID a colorID jsou další. Potom řádky, které odpovídají pouze garmentID následovat. Potom zbytek, který odpovídá pouze designID filtr WHERE doložka.

Věřím, že to stojí za to udělat v SQL. Jako @Toby poznamenal v druhé odpovědi , obecně se nemusíte starat o výkon při řazení tak malého počtu řádků, za předpokladu, že budete vždy filtrovat podle designID ... Pokud jde o vaši další otázku, nevím, zda existuje název pro takový dotaz - mám tendenci to nazývat "řazení podle výrazu".



  1. Předávání ID uživatele spouštěčům PostgreSQL

  2. Co jsou SQL Operators a jak fungují?

  3. MySQL falešně povoluje duplicitní záznamy, když je jedno ze zahrnutých polí NULL

  4. SSMS verze 18 – žádné databázové diagramy