Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Apakah ada teknik SQL untuk memesan dengan mencocokkan beberapa kriteria?

Jika saya mengerti dengan benar, sepertinya Anda dapat menggunakan ekspresi dalam ORDER BY , dengan cara yang mirip dengan jawaban yang diterima yang diberikan pada posting Stack Overflow berikut:

Oleh karena itu, kueri Anda mungkin terlihat seperti ini:

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

Perhatikan bahwa garmentID , colorID , dan sizeID tidak digunakan sebagai filter di WHERE ayat. Nilai hanya digunakan dalam ORDER BY ekspresi.

Kasus uji:

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

Hasil:

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)

Perhatikan bagaimana baris yang cocok dengan garmentID yang ditentukan , colorID dan sizeID adalah yang pertama. Jika gagal, baris yang cocok dengan garmentID dan colorID berikutnya. Kemudian baris yang hanya cocok dengan garmentID mengikuti. Kemudian sisanya, yang hanya cocok dengan designID filter dari WHERE klausa.

Saya percaya ini layak dilakukan dalam SQL. Sebagai @Toby mencatat dalam jawaban lain , secara umum Anda tidak perlu khawatir tentang kinerja saat mengurutkan sejumlah kecil baris, dengan asumsi Anda akan selalu memfilter berdasarkan designID ... Adapun pertanyaan Anda yang lain, saya tidak tahu apakah ada nama untuk kueri semacam itu - saya cenderung menyebutnya "mengurutkan dengan ekspresi".



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bagaimana cara mengaktifkan indeks besar di MariaDB 10?

  2. MySQL groupwise MAX() mengembalikan hasil yang tidak terduga

  3. Grup MySQL berdasarkan nilai berurutan

  4. UPDATE atau DELETE dulu lalu INSERT

  5. Bisakah basis data relasional menskalakan secara horizontal?