Categories: Techniques | Tags: | Views: 858

 

题目要求是这样的,假设有如下表(MySQL):

TABLE: test

id a b
1 4 2
2 1 2
3 1 3
4 3 2
5 1 5
6 1 2
7 4 -1
8 1 2

 写一条SQL语句,

选择所有a=1或b=2的记录,

使得a=1且b=2的记录排在最前面,

并且a=1且b=2的记录按id降序排列。

分析:

很显然,直接的order by方案是不行的。

那我们就需要把条件分割:把a=1 or b=2分割成(a=1 and b=2) or (a=1 and b!=2) or (a!=1 and b=2)

再把选择的结果union一下就可以得到想要的结果了。

关于(a=1 and b=2)记录按id的降序排列,需要用到order by,如果直接这么用:

 

1
SELECT ... FROM ... ORDER BY ... DESC UNION ...

是会报错的, 把前面的select语句加上括号,不会报错,但是达不到想要的效果(order by 不起作用)。

 

这个时候就要用到derived table了,不过别忘了给derived table取一个别名(alias)。

1
2
3
4
SELECT * FROM (
    SELECT * FROM `test` WHERE `a`=1 AND `b`=2 ORDER BY `id` DESC
) `ab` UNION 
SELECT * FROM `test` WHERE (`a`=1 AND `b`!=2) OR (`a`!=1 AND `b`=2)

 运行结果:

id a b
8 1 2
6 1 2
2 1 2
1 4 2
3 1 3
4 3 2
5 1 5
这篇文章来自 迷途知返(PWWANG.COM), 转载请注明出处。 版权说明

  1. December 14th, 2009 at 16:45
    Reply | Quote | #1

    之前学的都还给老师,这个学会了~~

;) :| :x :twisted: :roll: :oops: :o :mrgreen: :lol: :idea: :evil: :cry: :arrow: :P :D :?: :? :) :( :!: 8O 8)

你可以使用@somebody:开头, 来邮件通知somebody你回复了他的留言(用户名区分大小写).