正しく理解できれば、ORDER BY
で式を使用できるようです。 、次のStack Overflow投稿に与えられた受け入れられた回答と同様の方法で:
したがって、クエリは次のようになります。
SELECT imageID
FROM ...
JOIN ...
WHERE designID = 100
ORDER BY garmentID = 1 DESC,
colorID = 5 DESC,
sizeID = 10 DESC;
garmentID
に注意してください 、colorID
、およびsizeID
WHERE
ではフィルターとして使用されません 句。値はORDER BY
でのみ使用されます 式。
テストケース:
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);
結果:
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)
指定されたgarmentID
に一致する行がどのように一致するかに注意してください 、colorID
およびsizeID
最初です。それができない場合、garmentID
に一致する行 およびcolorID
次です。次に、garmentID
にのみ一致する行 従う。次に、designID
にのみ一致する残りの部分 WHERE
のフィルター 条項。
SQLでこれを行う価値があると思います。 @Tobyは他の回答に記載されています
、一般に、designID
で常にフィルタリングすることを前提として、このような少数の行を並べ替えるときにパフォーマンスを心配する必要はありません。 ...他の質問については、そのようなクエリの名前があるかどうかはわかりません。私はそれを「式による順序付け」と呼ぶ傾向があります。