|
查看: 1929|回复: 8
|
MYSQL的Query如何根据数据来决定ORDER BY的顺序 ??
[复制链接]
|
|
|
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, 是最后的方法...
请问还有其他方法吗 ?? |
|
|
|
|
|
|
|
|
|
|
发表于 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
|
显示全部楼层
|
|
|
|
|
|
|
|
|
|
发表于 30-9-2009 08:10 PM
|
显示全部楼层
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 30-9-2009 10:48 PM
|
显示全部楼层
|
|
|
|
|
|
|
|
|
|
发表于 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 编辑 ] |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 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 换。
好处是如果资料量很大的话,速度会提升很多;如果资料量不大,那么这个好处不明显。
坏处是程式的难度有一定的提升。
看个别情况决定吧! |
|
|
|
|
|
|
|
|
|
|

楼主 |
发表于 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也变得比较复杂一点。 |
|
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|