sql >> Database >  >> RDS >> Mysql

Is er een SQL-techniek om te bestellen door meerdere criteria te matchen?

Als ik het goed heb begrepen, lijkt het erop dat je uitdrukkingen kunt gebruiken in je ORDER BY , op een manier die vergelijkbaar is met het geaccepteerde antwoord op de volgende Stack Overflow-post:

Daarom kan uw vraag er als volgt uitzien:

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

Merk op dat garmentID , colorID , en sizeID worden niet gebruikt als filters in de WHERE clausule. De waarden worden alleen gebruikt in de ORDER BY uitdrukkingen.

Testgeval:

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

Resultaat:

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)

Let op hoe de rij die overeenkomt met de opgegeven garmentID , colorID en sizeID is eerste. Als dat niet lukt, worden de rijen die overeenkomen met garmentID en colorID zijn de volgende. Dan de rijen die alleen overeenkomen met garmentID volgen. Dan de rest, die alleen overeenkomt met de designID filter van de WHERE clausule.

Ik denk dat het de moeite waard is om dit in SQL te doen. Als @Toby merkte op in het andere antwoord , hoeft u zich over het algemeen geen zorgen te maken over de prestaties bij het sorteren van zo'n klein aantal rijen, ervan uitgaande dat u altijd filtert op designID ... Wat betreft uw andere vraag, ik weet niet of er een naam is voor zo'n zoekopdracht - ik noem het meestal "ordenen op een uitdrukking".



  1. Eenvoudige CRUD-bewerking met PDO-databaseverbinding

  2. Hoe kan ik het entiteitsraamwerk dwingen om identiteitskolommen in te voegen?

  3. Ontwerp van de aanbevelingsengine-database?

  4. MySQL-referenties verbergen in toepassing