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".