sql >> Databasteknik >  >> RDS >> Mysql

Finns det en SQL-teknik för att beställa genom att matcha flera kriterier?

Om jag förstått det rätt ser det ut som att du kan använda uttryck i din ORDER BY , på ett sätt som liknar det accepterade svaret på följande Stack Overflow-inlägg:

Därför kan din fråga se ut så här:

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

Observera att garmentID , colorID och sizeID används inte som filter i WHERE klausul. Värdena används endast i ORDER BY uttryck.

Testfall:

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

Resultat:

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)

Notera hur raden som matchar det angivna garmentID , colorID och sizeID är först. Om det misslyckas, raderna som matchar garmentID och colorID är nästa. Sedan raderna som bara matchar garmentID Följ. Sedan resten, som bara matchar designID filter för WHERE klausul.

Jag tror att det är värt att göra detta i SQL. Som @Toby noterade i det andra svaret , i allmänhet behöver du inte oroa dig för prestanda när du sorterar ett så litet antal rader, förutsatt att du alltid kommer att filtrera efter designID ... När det gäller din andra fråga, jag vet inte om det finns ett namn för en sådan fråga - jag brukar kalla det "ordna efter ett uttryck".



  1. php mysql Connect Database från en annan server

  2. Undantag:Det finns redan en öppen DataReader kopplad till denna anslutning som måste stängas först

  3. Mysql::Fel:Dubblett inmatning

  4. Beräkna din SQL Server Monitoring Total Cost of Ownership