我有几个表毗连在一路形成一个包括列的表
designID
garmentID
colorID
sizeID
imageID
我有一个看起来像这样的函数[方括号中的变量是可选的]:
getProductImages($designID,[$garmentID],[$colorID],[$sizeID]);
我但愿它按以下次序返回全部匹配$designID的imageID:
>起首匹配$garmentID,$colorID和$sizeID的行 >接下来与$garmentID和$colorID匹配的行 >接下来只匹配$garmentID的行 >最后匹配无(仅限$designID)的行
我只需加载与$designID匹配的全部行,然后在PHP中对它们举办排序,就可以很轻易地做到这一点,但我的领略是,在也许的环境下,在MySQL中举办排序凡是会更快.将有约莫20行匹配给定的$designID.
以是我的题目是双重的:是否值得在SQL语句中举办排序?假如我这样做,最好的要领是什么?
我也很想知道这种排序是否著名称.
最佳谜底
假如我领略正确,看起来您可以在ORDER BY中行使表达式,其方法相同于给出以下Stack Overflow帖子的接管谜底:
> Using MySql,can I sort a column but have 0 come last?
因此,您的查询也许如下所示:
SELECT imageID
FROM ...
JOIN ...
WHERE designID = 100
ORDER BY garmentID = 1 DESC,colorID = 5 DESC,sizeID = 10 DESC;
请留意,在WHERE子句中,衣服ID,colorID和sizeID不消作过滤器.这些值仅用于ORDER BY表达式.
测试用例:
CREATE TABLE designs (designID int,garmentID int,colorID int,sizeID int);
INSERT INTO designs VALUES (100,1,1);
INSERT INTO designs VALUES (100,2,2);
INSERT INTO designs VALUES (100,5,3);
INSERT INTO designs VALUES (100,10);
INSERT INTO designs VALUES (100,15);
INSERT INTO designs VALUES (100,8,20);
INSERT INTO designs VALUES (100,6,15);
INSERT INTO designs VALUES (101,1);
INSERT INTO designs VALUES (101,1);
功效:
SELECT *
FROM designs
WHERE designID = 100
ORDER BY garmentID = 1 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)
请留意与指定的衣服ID,colorID和sizeID匹配的行是怎样排在第一位的.假如做不到这一点,接下来是匹配garmentID和colorID的行.然后是仅匹配garmentID的行.然后是别的的,它只匹配WHERE子句的designID过滤器.
我信托在SQL中这样做是值得的.作为@Toby noted in the other answer,一样平常来说,排序这么少的行时你不必要担忧机能,假设你老是凭证designID举办过滤…至于你的其他题目,我不知道是否著名字对付这样的查询 – 我倾向于称之为“通过表达式排序”.
(编辑:湖南网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|