Rob*_*ert 5 php mysql sql sorting
我有几个表连接在一起形成一个包含列的表
designID
garmentID
colorID
sizeID
imageID
Run Code Online (Sandbox Code Playgroud)
我有一个看起来像这样的函数[方括号中的变量是可选的]:
getProductImages($designID, [$garmentID], [$colorID], [$sizeID]);
Run Code Online (Sandbox Code Playgroud)
我希望它按以下顺序返回所有匹配$ designID的imageID:
我只需加载与$ designID匹配的所有行,然后在PHP中对它们进行排序,就可以很容易地做到这一点,但我的理解是,在可能的情况下,在MySQL中进行排序通常会更快.将有大约20行匹配给定的$ designID.
所以我的问题是双重的:是否值得在SQL语句中进行排序?如果我这样做,最好的方法是什么?
我也很想知道这种排序是否有名称.
如果我理解正确,看起来你可以使用表达式,ORDER BY类似于给出以下Stack Overflow帖子的接受答案:
因此,您的查询可能如下所示:
SELECT imageID
FROM ...
JOIN ...
WHERE designID = 100
ORDER BY garmentID = 1 DESC,
colorID = 5 DESC,
sizeID = 10 DESC;
Run Code Online (Sandbox Code Playgroud)
需要注意的是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);
Run Code Online (Sandbox Code Playgroud)
结果:
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)
Run Code Online (Sandbox Code Playgroud)
请注意与指定的行匹配的行garmentID,colorID并且sizeID是第一行.如果做不到这一点,相匹配的行garmentID和colorID旁边.那么只匹配的行garmentID跟随.然后剩下的,只匹配条款的designID过滤器WHERE.
我相信在SQL中这样做是值得的.正如@Toby在另一个答案中指出的那样,一般来说,排序这么少的行时你不需要担心性能,假设你总是会过滤designID...至于你的其他问题,我不知道如果有这样一个查询的名称 - 我倾向于称它为"通过表达式排序".