要做:商城的留言板

一般情况,做留言板的显示很容易,直接select查询,再显示出来,但eschop中的留言板难点在于留言数据来自2张表,feedback表和comment表,我们需要把两张表中的内容都取出来,显示。

思路: 从业务逻辑层,用php来解决这个问题

1 先取出feedback表,循环取出数据,放入一个数组

2 再取出comment表,循环取出数据,放入一个数组

3 把取出两个数组合并

4 循环合并后的大数组整理

union关键字,可以给出多条select语句,并将他们的结果组合成单个结果集。合并时,两个表对应的列数和数据类型必须相同。各个select语句之间使用union或union all关键字分隔。union不使用all,执行的时候删除重复的记录,所有返回的行都是唯一的;使用关键字all的作用是不删除重复行也不对结果进行自动排序。

mysql> select s_id,f_name,f_price
-> from fruits
-> where f_price < 9.0
-> union all
-> select s_id,f_name,f_price
-> from fruits
-> where s_id in(101,103);

结果如下

能否从2张表查询在union那?

答:可以,union合并的是”结果集“,不区分来自那张表。

union后的结果集,能否再排序

答:可以

mysql> select goos_id,goods_name,shop_price from goods
-> where
-> shop_price < 100
-> union all
-> select goos_id,goods_name,shop_price from goods
-> where
-> shop_price > 4000
-> order by shop_price asc;

用union取出第4个栏目的商品和第5个栏目的商品,并按价格升序排列

mysql> select goos_id,cat_id,goods_name,shop_price from goods
-> where
-> cat_id = 4
-> union all
-> select goos_id,cat_id,goods_name,shop_price from goods
-> where
-> cat_id = 5
-> order by shop_price asc;

sql1 union sql2 order by 字段

注意:order by是针对合并后的结果集排的序

使用odrer by的注意事项

mysql> (select goos_id,cat_id,goods_name,shop_price from goods
-> where
-> cat_id = 4
-> order by shop_price desc)
-> union
-> (select goos_id,cat_id,goods_name,shop_price from goods
-> where
-> cat_id = 5
-> order by shop_price desc);

内层的order by语句没用起作用

mysql> (select goos_id,cat_id,goods_name,shop_price from goods
-> where
-> cat_id = 4
-> order by shop_price desc)
-> union
-> (select goos_id,cat_id,goods_name,shop_price from goods
-> where
-> cat_id = 5
-> order by shop_price desc)
-> order by shop_price asc;



外层语句还要对最终结果再次排序,因此内层的语句排序就没用意义。因此,内层的order by语句单独使用,,不会影响结果集,仅排序,在执行期间,就被MySQL的代码优化器给优化掉了。内层的order by必须能够影响结果集时才有意义,比如配合limit使用。

问题:查出第3个栏目下,价格前3高的商品和第4个栏目下,价格前2高的商品

mysql> (select goos_id,cat_id,goods_name,shop_price from goods
-> where cat_id = 4
-> order by shop_price desc limit 2)
-> union all
-> (select goos_id,cat_id,goods_name,shop_price from goods
-> where cat_id = 3
-> order by shop_price desc limit 3);

这一次,内层的order by发挥了作用,因为有limit,order by会影响

一道面试题

建立两张表,插入如下数据,

要求结果如下

思路1 左连 union 右连 ,在子查询,如果遇到问题,查if null函数

思路2

mysql> select id,sum(num) from (
-> select * from a
-> union all
-> select * from b) as temp
-> group by id;

注意 如果不用 union all 结果会不正确

MySQL学习(十)的更多相关文章

  1. MySQL学习(十五)

    索引的概念 索引是数据的目录,能快速定位数据的位置.索引提高了查询速度,降低了增删改的速度.并非加的越多越好. 一般在查询频率高的列上加,而且在重复度低的列上加效果更好.如在性别列上不用加索引,但是身 ...

  2. MySQL学习(十六)

    MySQL高级部分 触发器 触发器是一类特殊的事务,可以监视某种数据操作(insert/update/delete),并触发相关的操作(insert/update/delete) 触发器创建语法之4要 ...

  3. MySQL学习(十四)

    utf8的bom问题 在xp下,用记事本创建utf8文件的时候,前面多了3个字节,这3个字节不用来显示,是用来辨识编码用的,EF BB BF告诉记事本,这是utf8编码. 存储引擎和事务简单介绍 引擎 ...

  4. MySQL学习(十二)

    视图 view 在查询中,我们经常把查询结果当成临时表来看, view是什么?view可以看成一张虚拟表,是表通过某种运算得到的一个投影. 表的变化会影响到视图 既然视图只是表的某种查询的投影,所以主 ...

  5. 我的MYSQL学习心得(十) 自定义存储过程和函数

    我的MYSQL学习心得(十) 自定义存储过程和函数 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心 ...

  6. 我的MYSQL学习心得(十二) 触发器

    我的MYSQL学习心得(十二) 触发器 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数 ...

  7. 我的MYSQL学习心得(十四) 备份和恢复

    我的MYSQL学习心得(十四) 备份和恢复 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) ...

  8. 我的MYSQL学习心得(十五) 日志

    我的MYSQL学习心得(十五) 日志 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

  9. 我的MYSQL学习心得(十六) 优化

    我的MYSQL学习心得(十六) 优化 我的MYSQL学习心得(一) 简单语法 我的MYSQL学习心得(二) 数据类型宽度 我的MYSQL学习心得(三) 查看字段长度 我的MYSQL学习心得(四) 数据 ...

随机推荐

  1. Percona Server 5.6 安装TokuDB

    系统:Red Hat Enterprise Linux Server release 6.3 (Santiago) 数据库:Percona-Server-5.6.29-rel76.2-Linux.x8 ...

  2. 【题解】Luogu P1648 看守

    原题传送门:P1648 看守 这题目让求得的是d维( d <=4 )空间中n个点( 2 <= N <= 1000000 )之间最大的哈曼顿距离 模拟,emm,能拿30分,不错 因为d ...

  3. json排序 及替换在字符串中全部替换某字符串

    var roadLine = '@ViewBag.RoadLine'; var jsonRoadLine = JSON.parse(roadLine.replace(/"/g, '\&quo ...

  4. python之路-day1-while循环

    while Thue: (条件为真无限循环)  break(跳出循环) 猜年龄: #Author:zwwage_of_jay = 40count = 0while count < 3: gues ...

  5. Git总结笔记

    git相关配置 # 设置你的 Git 用户名 git config --global user.name "<Your-Full-Name>" # 设置你的 Git 邮 ...

  6. bzoj 3560 DZY Loves Math V - 线性筛 - 扩展欧几里得算法

    给定n个正整数a1,a2,…,an,求 的值(答案模10^9+7). Input 第一行一个正整数n. 接下来n行,每行一个正整数,分别为a1,a2,…,an. Output 仅一行答案. Sampl ...

  7. hdu 1151 Air Raid - 二分匹配

    Consider a town where all the streets are one-way and each street leads from one intersection to ano ...

  8. Selenium 15: How to Run Parallel Tests Using Selenium Grid and JUnit

    In this post, I will give two techniques and describe how to run your selenium tests in parallel by ...

  9. [jsp & thymeleaf] - jsp和thymeleaf的共存解析

    做项目时因为有些老jsp还需要测试用到,所以之前的thymeleaf也需要保持,配置如下: https://github.com/deadzq/jsp-thymeleaf 等空余时间在做详解吧!

  10. 【Hadoop 分布式部署 三:基于Hadoop 2.x 伪分布式部署进行修改配置文件】

    1.规划好哪些服务运行在那个服务器上 需要配置的配置文件 2. 修改配置文件,设置服务运行机器节点 首先在   hadoop-senior  的这台主机上 进行   解压 hadoop2.5   按照 ...