PHP MySQL UNION 与 UNION ALL 语法与用法

10 篇文章 2 订阅

MySQL UNION 语法

MySQL UNION 用于把来自多个 SELECT 语句的结果组合到一个结果集合中。语法为:

SELECT column,... FROM table1 
UNION [ALL]
SELECT column,... FROM table2
...

在多个 SELECT 语句中,对应的列应该具有相同的字段属性,且第一个 SELECT 语句中被使用的字段名称也被用于结果的字段名称。

UNION 与 UNION ALL 的区别

当使用 UNION 时,MySQL 会把结果集中重复的记录删掉,而使用 UNION ALL ,MySQL 会把所有的记录返回,且效率高于 UNION。

MySQL UNION 用法实例

UNION 常用于数据类似的两张或多张表查询,如不同的数据分类表,或者是数据历史表等。下面是用于例子的两张原始数据表:

article 文章表:
aidtitlecontent
1文章1文章1正文内容...
2文章2文章2正文内容...
3文章3文章3正文内容...
blog 日志表:
bidtitlecontent
1日志1日志1正文内容...
2文章2文章2正文内容...
3日志3日志3正文内容...

上面两个表数据中,aid=2 的数据记录与 bid=2 的数据记录是一样的。

使用 UNION 查询

查询两张表中的文章 id 号及标题,并去掉重复记录:

SELECT aid,title FROM article UNION SELECT bid,title FROM blog

返回查询结果如下:

aidtitle
1文章1
2文章2
3文章3
1日志1
3日志3

UNION 查询结果说明

  1. 重复记录是指查询中各个字段完全重复的记录,如上例,若 title 一样但 id 号不一样算作不同记录。
  2. 第一个 SELECT 语句中被使用的字段名称也被用于结果的字段名称,如上例的 aid。
  3. 各 SELECT 语句字段名称可以不同,但字段属性必须一致。

使用 UNION ALL 查询

查询两张表中的文章 id 号及标题,并返回所有记录:

SELECT aid,title FROM article UNION ALL SELECT bid,title FROM blog

返回查询结果如下:

aidtitle
1文章1
2文章2
3文章3
1日志1
2文章2
3日志3

显然,使用 UNION ALL 的时候,只是单纯的把各个查询组合到一起而不会去判断数据是否重复。因此,当确定查询结果中不会有重复数据或者不需要去掉重复数据的时候,应当使用 UNION ALL 以提高查询效率。

DB::query("SELECT * FROM (SELECT itemid, addtime, title, type, introduce, forwardingid, forwarding_type, comments, likes, hits, '' as totime, '' as vote_min, '' as vote_max, '' as votes, username, status, edittime FROM `tableA` UNION SELECT itemid, addtime, title, type, introduce, forwardingid, forwarding_type, comments, likes, hits, totime, vote_min, vote_max, votes, editor as username, status, edittime FROM `tableB` UNION SELECT itemid, addtime, title, type, introduce, forwardingid, forwarding_type, comments, likes, hits, '' as totime, '' as vote_min, '' as vote_max, '' as votes, editor as username, status, edittime FROM `tableC`) d WHERE d.username " . $where . " AND d.status=3 AND (d.totime>" . time() . " OR d.totime='') ORDER BY d.addtime DESC LIMIT {$start}, 10");

联合查询:

如果你想把多个查询的结果合并在一起创建一个结果集,我们可以使用UNION查询来做。

(1)列名

注意:查询的列名不一定要相同,结果集中的列名,是以第一个表的查询结果为准。

(2)关于重复记录

如果有重复的记录,则只显示一条。

我就希望把所有的显示出来,这个时候可以使用 UNION ALL

(3)关于排序

select i,c from t1 union select i,d from t3 order by i desc;

错误:

 mysql> select i,c from t1 order by i desc union
select i,d from t3 order by i desc;
ERROR 1221 (HY000): Incorrect usage of UNION and ORDER BY

加括号:

(select i,c from t1 order by i desc) union (select i,d from t3 order by i desc);

结果并未排序

需要再加limit

 (select i,c from t1 order by i desc limit 3) union (select i,d from
t3 order by i desc limit 3)

这才ok了!

注意,

a. 在UNION 中,你要对结果集先排序,后union时候,需要将其用括号括起来

b. 要使用Limit,排序结果才可以起作用。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值