要做:商城的留言板

一般情况,做留言板的显示很容易,直接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. Django基础(10): URL重定向的HttpResponseDirect, redirect和reverse的用法详解

    利用django开发web应用, 我们经常需要进行URL重定向,有时候还需要给URL传递额外的参数.比如用户添加文章完成后需要转到文章列表或某篇文章详情.因此熟练掌握HttpResponseDirec ...

  2. 注册登录二合一之bootstrap

    来源 https://bootsnipp.com/snippets/featured/login-and-register-tabbed-form jquery插件 需导入bootstrap插件 这个 ...

  3. rabbitmq队列的exclusive,durability,auto-delete属性以及消息可靠传输设计

    非集群下,简单的说:- 如果是excl,则设置durability没有意义,因为不管服务器挂了还是客户端主动/被动断开了,队列都会自动删除.- auto-delete,其实可简单的认为是同理,即使非e ...

  4. 【题解】Luogu P1648 看守

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

  5. hdu 1394 Minimum Inversion Number - 树状数组

    The inversion number of a given number sequence a1, a2, ..., an is the number of pairs (ai, aj) that ...

  6. 如何在servlet中获取spring创建的bean

    package com.yxf.controller; import java.io.IOException; import javax.servlet.ServletException; impor ...

  7. Junit中的setUp()与setUpBefore(), tearDown()与tearDownAfterClass()解析

    @BeforeClass public static void setUpBeforeClass() throws Exception { } @AfterClass public static vo ...

  8. ODAC(V9.5.15) 学习笔记(十三)TOraMetaData

    通过TOraMetaData控件获取Oracle数据库对象信息,首先需要设置MetaDataKind属性,然后设置Restrictions属性设置条件,最后通过激活数据集获取信息,演示代码如下: Me ...

  9. oracle单行函数 之 通用函数

    NVL()函数,处理null. Decode()函数,:多数值判断 Decode(数值 \ 列,判断值1,显示值1,判断值2,显示值2)若是判断值不包含的,则显示为空 Decode()函数非常类似程序 ...

  10. Spring核心简介

    Spring简介 Spring是一个开源.轻量级框架.在诞生之初,创建Spring的主要目的是用来替代更加重量级的企业级Java技术,尤其是EJB(Enterprise JavaBean).从最初的挑 ...