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

Er der en SQL-teknik til at bestille ved at matche flere kriterier?

Hvis jeg har forstået det rigtigt, ser det ud til, at du kan bruge udtryk i din ORDER BY , på en måde svarende til det accepterede svar givet til følgende Stack Overflow-indlæg:

Derfor kan din forespørgsel se sådan ud:

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

Bemærk at garmentID , colorID og sizeID bruges ikke som filtre i WHERE klausul. Værdierne bruges kun i ORDER BY udtryk.

Testtilfælde:

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)

Bemærk, hvordan rækken, der matcher det angivne garmentID , colorID og sizeID er først. I modsat fald vil de rækker, der matcher garmentID og colorID er næste. Så de rækker, der kun matcher garmentID følge efter. Så resten, som kun matcher designID filter af WHERE klausul.

Jeg tror, ​​det er værd at gøre dette i SQL. Som @Toby noterede i det andet svar , generelt behøver du ikke bekymre dig om ydeevne, når du sorterer et så lille antal rækker, forudsat at du altid vil filtrere efter designID ... Hvad angår dit andet spørgsmål, så ved jeg ikke, om der er et navn for sådan en forespørgsel - jeg plejer at kalde det "ordre efter et udtryk".



  1. Type mismatch:kan ikke konvertere fra java.util.Date til java.sql.Date

  2. En mere dynamisk måde at indlejre kategorier på flere niveauer

  3. Konverter en mysql-dato (datetime) til et bedre datoformat ved hjælp af php

  4. Live søgning ved hjælp af Codeigniter Mysql