加入收藏 | 设为首页 | 会员中心 | 我要投稿 辽源站长网 (https://www.0437zz.com/)- 云专线、云连接、智能数据、边缘计算、数据安全!
当前位置: 首页 > 站长学院 > MySql教程 > 正文

php – 是否有通过匹配多个条件进行排序的SQL技术?

发布时间:2021-05-26 07:39:37 所属栏目:MySql教程 来源:网络整理
导读:我有几个表连接在一起形成一个包含列的表 designIDgarmentIDcolorIDsizeIDimageID 我有一个看起来像这样的函数[方括号中的变量是可选的]: getProductImages($designID,[$garmentID],[$colorID],[$sizeID]); 我希望它按以下顺序返回所有匹配$designID的image

我有几个表连接在一起形成一个包含列的表

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进行过滤…至于你的其他问题,我不知道是否有名字对于这样的查询 – 我倾向于称之为“通过表达式排序”.

(编辑:辽源站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读