Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2268498
  • 博文数量: 293
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 2170
  • 用 户 组: 普通用户
  • 注册时间: 2014-03-31 14:30
个人简介

自己慢慢积累。

文章分类

全部博文(293)

分类: Mysql/postgreSQL

2015-08-24 15:44:08

首先看下官方文档

点击(此处)折叠或打开

  1. 如果您想使用ORDER BY或LIMIT子句来对全部UNION结果进行分类或限制,则应对单个地SELECT语句加圆括
  2. 号,并把ORDER BY或LIMIT放到最后一个的后面。以下例子同时使用了这两个子句:
  3. (SELECT a FROM tbl_name WHERE a=10 AND B=1)
  4. UNION
  5. (SELECT a FROM tbl_name WHERE a=11 AND B=2)
  6. ORDER BY a LIMIT 10;
  7. 这种ORDER BY不能使用包括表名称(也就是,采用tbl_name.col_name格式的名称)列引用。可以在第一
  8. 个SELECT语句中提供一个列别名,并在ORDER BY中参阅别名,或使用列位置在ORDER BY中参阅列。(首选
  9. 采用别名,因为不建议使用列位置。)
  10. 另外,如果带分类的一列有别名,则ORDER BY子句必须引用别名,而不能引用列名称。以下语句中的第一个
  11. 语句必须运行,但是第二个会运行失败,出现在'order clause'中有未知列'a'的错误:
  12. (SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY b;
  13. (SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY a;
  14. To apply ORDER BY or LIMIT to an individual SELECT, place the clause inside the parentheses that enclose

  15. 为了对单个SELECT使用ORDER BY或LIMIT,应把子句放入圆括号中。圆括号包含了SELECT:
  16. (SELECT a FROM tbl_name WHERE a=10 AND B=1 ORDER BY a LIMIT 10)
  17. UNION
  18. (SELECT a FROM tbl_name WHERE a=11 AND B=2 ORDER BY a LIMIT 10);
  19. 圆括号中用于单个SELECT语句的ORDER BY只有当与LIMIT结合后,才起作用。否则,ORDER BY被优化去
  20. 除。
看几个关键点:
1、“如果您想使用ORDER BY或LIMIT子句来对全部UNION结果进行分类或限制,则应对单个地SELECT语句加圆括号,并把ORDER BY或LIMIT放到  最后一个的后面。”
--这个试验了下,发现 不加括号 把ORDER BY或者limit 放到最后会生效,但是最好还是把括号加上,以免引起阅读的误解。 

2、“这种ORDER BY不能使用包括表名称(也就是,采用tbl_name.col_name格式的名称)列引用。可以在第一个SELECT语句中提供一个列别名,并在ORDER BY中参阅别名,或使用列位置在ORDER BY中参阅列。(首选采用别名,因为不建议使用列位置。)
另外,如果带分类的一列有别名,则ORDER BY子句必须引用别名,而不能引用列名称”
--试验证明确实如此,需要在使用中注意!

3、“为了对单个SELECT使用ORDER BY或LIMIT,应把子句放入圆括号中,且ORDER BY 与 Limit 同时使用才能生效,否则order by 会被优化去除”
--试验证明确实如此,如果要对单个select 排序 order by 必须结合 limit 来使用 


举例:
建立一个vehicle 表

点击(此处)折叠或打开

  1. mysql> select * from vehicle;
  2. +----+----------+------+---------------------+
  3. | id | hphm | hpzl | jgsj |
  4. +----+----------+------+---------------------+
  5. | 1 | 冀X11111 | 轿车 | 2015-08-24 14:06:54 |
  6. | 2 | 冀X11111 | 轿车 | 2015-08-24 14:07:12 |
  7. | 3 | 冀X22222 | 轿车 | 2015-08-24 14:07:36 |
  8. | 4 | 冀X22222 | 轿车 | 2015-08-24 13:07:49 |
  9. | 5 | 冀X33333 | 客车 | 2015-08-24 14:08:12 |
  10. | 6 | 冀X33333 | 客车 | 2015-08-24 14:08:51 |
  11. +----+----------+------+---------------------+

结合limit 来使order by 生效

点击(此处)折叠或打开

  1. mysql> (select id,hphm,hpzl,jgsj from vehicle where hphm='冀X22222' order by jgsj desc ) union (select id,hphm,hpzl,jgsj from vehicle where hphm='冀X11111' order by jgsj desc);
  2. +----+----------+------+---------------------+
  3. | id | hphm | hpzl | jgsj |
  4. +----+----------+------+---------------------+
  5. | 4 | 冀X22222 | 轿车 | 2015-08-24 13:07:49 |
  6. | 3 | 冀X22222 | 轿车 | 2015-08-24 14:07:36 |
  7. | 1 | 冀X11111 | 轿车 | 2015-08-24 14:06:54 |
  8. | 2 | 冀X11111 | 轿车 | 2015-08-24 14:07:12 |
  9. +----+----------+------+---------------------+
  10. 4 rows in set

  11. mysql> (select id,hphm,hpzl,jgsj from vehicle where hphm='冀X22222' order by jgsj desc limit 10) union (select id,hphm,hpzl,jgsj from vehicle where hphm='冀X11111' order by jgsj desc limit 10);
  12. +----+----------+------+---------------------+
  13. | id | hphm | hpzl | jgsj |
  14. +----+----------+------+---------------------+
  15. | 3 | 冀X22222 | 轿车 | 2015-08-24 14:07:36 |
  16. | 4 | 冀X22222 | 轿车 | 2015-08-24 13:07:49 |
  17. | 2 | 冀X11111 | 轿车 | 2015-08-24 14:07:12 |
  18. | 1 | 冀X11111 | 轿车 | 2015-08-24 14:06:54 |
  19. +----+----------+------+---------------------+
  20. 4 rows in set





阅读(1235) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~