如果我理解正确,您似乎可以在 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 的行跟随。然后剩下的,只匹配WHERE子句的designID过滤器。
我相信在 SQL 中这样做是值得的。作为@Toby noted in the other answer,一般来说你不需要担心排序这么少的行时的性能,假设你总是按designID过滤... 至于你的其他问题,我不知道是否此类查询有一个名称 - 我倾向于将其称为“按表达式排序”。