如果我正确理解,看来您可以在
ORDER BY,中使用表达式,类似于对以下帖子给出的可接受答案:
- 使用MySql,我可以对一列进行排序,但最后有0位吗?
因此,您的查询可能如下所示:
SELECt imageIDFROM ...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…进行过滤…至于其他问题,我不知道如果有这样的查询的名称-
我倾向于称其为“按表达式排序”。



