佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1929|回复: 8

MYSQL的Query如何根据数据来决定ORDER BY的顺序 ??

[复制链接]
发表于 30-9-2009 03:31 PM | 显示全部楼层 |阅读模式
QUERY :

SELECT DISTINCT SIZE FROM STOCK
ORDER BY IF(SIZE  IN('S','M', 'L', 'EL'), SIZE DESC, SIZE ASC) ;

这个Query有Error。
(当SIZE的Value是'S','M', 'L', 'EL'时,要Sort DESC,其他Value ASC)

这样子就可以 :

SELECT DISTINCT SIZE FROM STOCK

ORDER BY IF(SIZE  IN('S','M', 'L', 'EL'), SEQ, SIZE) ;

OR


SELECT DISTINCT SIZE FROM STOCK
ORDER BY SEQ ASC;

但要改Table Structure加SEQ field, 是最后的方法...
请问还有其他方法吗 ??
回复

使用道具 举报


ADVERTISEMENT

发表于 30-9-2009 04:33 PM | 显示全部楼层
研究了一阵,发现你的Query好像无法成立。。。可能我的水准太差了吧。。。

再想了一阵子,你的Query里面,SIZE的result set应该会return multiple rows,这就造成 IF() 无法成立了。

[ 本帖最后由 geekman 于 30-9-2009 04:38 PM 编辑 ]
回复

使用道具 举报

 楼主| 发表于 30-9-2009 05:50 PM | 显示全部楼层
原帖由 geekman 于 30-9-2009 04:33 PM 发表
研究了一阵,发现你的Query好像无法成立。。。可能我的水准太差了吧。。。

再想了一阵子,你的Query里面,SIZE的result set应该会return multiple rows,这就造成 IF() 无法成立了。


谢谢你的回复。
IN Statement只是'S','M', 'L', 'EL'(distinct row),而IF会对每个ROW做评估,不会有问题。。
只是要用IF Statement来control DESC,ASC就头大了。。

[ 本帖最后由 k-1 于 30-9-2009 05:54 PM 编辑 ]
回复

使用道具 举报

发表于 30-9-2009 08:10 PM | 显示全部楼层
我想你弄错一件事了,IN()是和WHERE一起用的,例如:
SELECT * FROM database
WHERE the_field IN(pattern1, pattern2, pattern3...)。

你可以去 http://www.w3schools.com/sql/sql_in.asp 看看。
回复

使用道具 举报

 楼主| 发表于 30-9-2009 10:48 PM | 显示全部楼层
原帖由 geekman 于 30-9-2009 08:10 PM 发表
我想你弄错一件事了,IN()是和WHERE一起用的,例如:
SELECT * FROM database
WHERE the_field IN(pattern1, pattern2, pattern3...)。

你可以去 http://www.w3schools.com/sql/sql_in.asp 看看。


未必的,IN() Statement也可以用在ORDER BY那边,
MySQL网站的Reference Manual会有比较深入的解释。

http://dev.mysql.com/doc/refman/5.0/en/select.html
请参考Gregory Turner的Example。
回复

使用道具 举报

发表于 1-10-2009 01:58 AM | 显示全部楼层

回复 5# k-1 的帖子

可是Gregory的sample里面并没有使用到IF()。

根据 http://dev.mysql.com/doc/refman/ ... ns.html#function_if 的说明,IF(expr1,expr2,expr3),或者说 IF(condition, true case, false case),其condition不能够有multiple rows的result set,因为MySQL无法判断要用哪一个row的data作为condition。

如果我没理解错的话你的IN()将导致你的result set最大会有4个rows,即
row1  S
row2  M
row3  L
row4  EL
如果你的目的只是要找出你的query是否会拿到S,M,L,EL任何一个或以上的result set, 或许你可以尝试使用 COUNT():

SELECT COUNT(DISTINCT SIZE) AS count FROM STOCK
WHERE SIZE IN('S', 'M', 'L', 'EL')

如果count > 0 那你的result set 就包含 S, M, L, EL 任何一个或以上。反之则你的data set并没有那些数值。至于如何把IF()套用进去我就想不通了,水准没那么高。。。 (我还是SQL菜鸟

//edit//
再仔细地看了Gregory的sample,发现他的statement似乎已经可以解决你的问题了(如果他的statement没有问题的话):
SELECT * FROM countries ORDER by iso_code IN ('UK', 'US') desc, iso_code
=〉
SELECT DISTINCT SIZE FROM STOCK ORDER by SIZE IN ('S', 'M', 'L', 'EL') desc, SIZE;

[ 本帖最后由 geekman 于 1-10-2009 02:05 AM 编辑 ]
回复

使用道具 举报

Follow Us
 楼主| 发表于 1-10-2009 10:37 AM | 显示全部楼层
原帖由 geekman 于 1-10-2009 01:58 AM 发表
可是Gregory的sample里面并没有使用到IF()。

根据 http://dev.mysql.com/doc/refman/5.0/en/control-flow-functions.html#function_if 的说明,IF(expr1,expr2,expr3),或者说 IF(condition, true case, false c ...
再仔细地看了Gregory的sample,发现他的statement似乎已经可以解决你的问题了(如果他的statement没有问题的话):
SELECT * FROM countries ORDER by iso_code IN ('UK', 'US') desc, iso_code
=〉
SELECT DISTINCT SIZE FROM STOCK ORDER by SIZE IN ('S', 'M', 'L', 'EL') desc, SIZE;


对 ! 昨天晚上我在看过一遍Gregory的Sample,确实把我的问题解决了。。

不过,

SELECT DISTINCT SIZE FROM STOCK ORDER by SIZE IN ('S', 'M', 'L', 'EL') desc, SIZE;

这个Query只是把整组'S', 'M', 'L', 'EL'放在前面(DESC)或后面(ASC)罢了,但不能Sort成我要的组合('S', 'M', 'L', 'EL'), 不过我再Modify一下就可以了,

SELECT DISTINCT SIZE FROM STOCK ORDER BY SIZE IN ('S')DESC, SIZE IN ('M')DESC, SIZE IN ('L')DESC, SIZE IN ('EL') DESC;

(看起来有点不可思议,不过出来的Resultset就是我要的)

至于IF Statement,是我RND时加上去的,不过确实是可以吖,你可以弄一个Table来玩玩看。
回复

使用道具 举报

发表于 3-10-2009 10:31 AM | 显示全部楼层
一般会把资料结构修改,把英文字母用数字代替。

将 文字资料 'S', 'M', 'L', 'EL‘ 改为 数字资料 0, 1, 2, 3 。

排序的时候使用数字会比较简单,速度也快得多。而且'S', 'M', 'L', 'EL‘ 这样的排序,无法使用index加速排序,而数字 0, 1, 2, 3 可以。
显示的时候把数字换成文字显示,可以用程式换或者用 link table 换。

好处是如果资料量很大的话,速度会提升很多;如果资料量不大,那么这个好处不明显。
坏处是程式的难度有一定的提升。

看个别情况决定吧!
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 3-10-2009 04:28 PM | 显示全部楼层
原帖由 chu10 于 3-10-2009 10:31 AM 发表
一般会把资料结构修改,把英文字母用数字代替。
将 文字资料 'S', 'M', 'L', 'EL‘ 改为 数字资料 0, 1, 2, 3 。
排序的时候使用数字会比较简单,速度也快得多。而且'S', 'M', 'L', 'EL‘ 这样的排序,无法使用 ...


INTEGER的执行速度会比CHAR快,但不是很明显,通常有用INDEX已经很足够了。

一般旧系统要改的话会有一定的风险,因为这会影响到整个SYSTEM,
不止DATABASE,PROGRAM也要更改,如果出了什么差错,这会影响了客户的业务。
况且速度的提升也不明显。

如果是新的系统,那可以做考虑,不过用LINK TABLE也会拖慢了QUERY,
而且TROUBLESHOOTING或HANDOVER也变得比较复杂一点。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 7-12-2025 11:15 AM , Processed in 0.122684 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表