我有几个表,它们结合在一起形成一个带有列的表
designID garmentID colorID sizeID imageID
我有一个看起来像这样的函数[方括号中的变量是可选的]:
getProductImages($designID, [$garmentID], [$colorID], [$sizeID]);
我希望它按以下顺序返回与$ designID匹配的所有imageID:
我可以很容易地做到这一点,只需加载与$ designID匹配的所有行,然后在PHP中对它们进行排序,但是我的理解是,在可能的情况下,在MySQL中进行排序通常会更快。大约有20行匹配给定的$ designID。
所以我的问题是双重的:是否值得在SQL语句中进行排序?如果这样做,最好的方法是什么?
我也很想知道是否有这种排序的名称。
如果我正确理解,看来您可以在ORDER BY,中使用表达式,类似于对以下帖子给出的可接受答案:
ORDER BY
因此,您的查询可能如下所示:
SELECT imageID FROM ... JOIN ... WHERE designID = 100 ORDER BY garmentID = 1 DESC, colorID = 5 DESC, sizeID = 10 DESC;
需要注意的是garmentID,colorID和sizeID不作为的过滤器WHERE子句。这些值仅在ORDER BY表达式中使用。
garmentID
colorID
sizeID
WHERE
测试用例:
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。
designID
我相信在SQL中值得这样做。正如@Toby在另一个答案中指出的那样,一般来说,在对这么少的行进行排序时,您无需担心性能,只要假设您始终按designID…进行过滤…至于其他问题,我不知道如果有这样的查询的名称- 我倾向于称其为“按表达式排序”。