|
Nov
28
|
|
|
Categories: Techniques
| Tags: SQL
| Views: 2,443
|
题目要求是这样的,假设有如下表(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,如果直接这么用:
SELECT ... FROM ... ORDER BY ... DESC UNION ...
是会报错的, 把前面的select语句加上括号,不会报错,但是达不到想要的效果(order by 不起作用)。
这个时候就要用到derived table了,不过别忘了给derived table取一个别名(alias)。
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 |
From 迷途知返, post 关于SQL的一道笔试题
RELATED POSTS:


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