mysql中union all使用注意点_mysql中union和union all的区别和注意点

昨天有个功能要实现排行效果,而且是随机按照某些字段的总值,但是第一个又要不一样,因为第一个人给了钱,所以要排第一。

打个比方吧,表(userinfo)中有这几个字段:username,isvalid,givedmoney,sumip,dayip,monthip,visitcount,regdate

现在要实现显示排行前10位用户,

出现在排行第一位的要是givedmoney为1的用户(表示给了钱), 而且isvalid为1(表示通过认证)

其它的9个用户呢,要在字段(sumip,dayip,monthip,visitcount)中随机选择一个作为排序的依据

这样的sql语句改怎么写呢?

下面是我的答案:

$arr_orderby=array("sumip","dayip","monthip","visitcount");

$orderby_filed=$arr_orderby(array_rand($arr_orderby) ); //得到随机字段

$sql="(select username,".$orderby_filed." from userinfo where isvalid=1 and givedmoney=1 limit 1) union (select username,".$orderby_filed." from userinfo where isvalid=1 and givedmoney!=1 limit 9) order by rand(),".$orderby_filed." desc";

?>

这里需要注意的几点是,

1:union前后的select字段一定要一样,而且顺序要一样,如果你不是select * 的话

2:第二个select中,试试limit 9和limit 10有什么不一样的效果

union和union all的区别就是后面能踢出重复的结果,如果确定表中没有重复的字段,建议使用union all

一 UNION语法

代码 复制代码

SELECT ...

UNION [ALL | DISTINCT]

SELECT ...

[UNION [ALL | DISTINCT]

SELECT ...]

SELECT ...

UNION [ALL | DISTINCT]

SELECT ...

[UNION [ALL | DISTINCT]

SELECT ...]

UNION用于把来自许多SELECT语句的结果组合到一个结果集合中。 (

如果你要将多个表的查询结果进行合并输出比如说 群组消息跟个人消息表是分离的但是想一起提取出来并显示的话就可以如此处理。通过UNION联合查询出来即可)

列于每个SELECT语句的对应位置的被选择的列应具有相同的类型(

前提条件是两个SELECT出来的列类型要保持一样的才行!)。(例如,被第一个语句选择的第一列应和被其它语句选择的第一列具有相同的类型。)在第一个SELECT语句中被使用的列名称也被用于结果的列名称。

SELECT语句为常规的选择语句,但是受到如下的限定:

·          只有最后一个SELECT语句可以使用INTO OUTFILE。

·          HIGH_PRIORITY不能与作为UNION一部分的SELECT语句同时使用。如果您对第一个 SELECT指定了HIGH_PRIORITY,则不会起作用。如果您对其它后续的SELECT语句指定了HIGH_PRIORITY,则会产生语法错误。

如果您对UNION不使用关键词ALL,则所有返回的行都是唯一的,如同您已经对整个结果集合使用了DISTINCT。如果您指定了ALL,您会从所有用过的SELECT语句中得到所有匹配的行。

DISTINCT关键词是一个自选词,不起任何作用,但是根据SQL标准的要求,在语法中允许采用。(在MySQL中,DISTINCT代表一个共用体的默认工作性质。)

您可以在同一查询中混合UNION ALL和UNION DISTINCT。被混合的UNION类型按照这样的方式对待,即DISTICT共用体覆盖位于其左边的所有ALL共用体。DISTINCT共用体可以使用UNION DISTINCT明确地生成,或使用UNION(后面不加DISTINCT或ALL关键词)隐含地生成。

如果您想使用ORDER BY或LIMIT子句来对全部UNION结果进行分类或限制,则应对单个地SELECT语句加圆括号,并把ORDER BY或LIMIT放到最后一个的后面。以下例子同时使用了这两个子句:

代码 复制代码

(SELECT a FROM tbl_name WHERE a=10 AND B=1)UNION(SELECT a FROM tbl_name WHERE a=11 AND B=2)ORDER BY a LIMIT 10;(

如果想要实现分页的话可以这样处理  将两个查询的结果集当作是一个大的结果集处理然后再对此大的结果集进行LIMIT处理即可实现!)好好好 ~!

(SELECT a FROM tbl_name WHERE a=10 AND B=1)UNION(SELECT a FROM tbl_name WHERE a=11 AND B=2)ORDER BY a LIMIT 10;

这种ORDER BY不能使用包括表名称(也就是,采用tbl_name.col_name格式的名称)列引用。可以在第一个SELECT语句中提供一个列别名,并在 ORDER BY中参阅别名,或使用列位置在ORDER BY中参阅列。(首选采用别名,因为不建议使用列位置。)

另外,如果带分类的一列有别名,则ORDER BY子句必须引用别名,而不能引用列名称。以下语句中的第一个语句必须运行,但是第二个会运行失败,出现在'order clause'中有未知列'a'的错误:

代码 复制代码

(SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY b;(SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY a;To apply ORDER BY or LIMIT to an individual SELECT, place the clause inside the parentheses that enclose the SELECT:

(SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY b;(SELECT a AS b FROM t) UNION (SELECT ...) ORDER BY a;To apply ORDER BY or LIMIT to an individual SELECT, place the clause inside the parentheses that enclose the SELECT:

为了对单个SELECT使用ORDER BY或LIMIT,应把子句放入圆括号中。圆括号包含了SELECT:

代码 复制代码

(SELECT a FROM tbl_name WHERE a=10 AND B=1 ORDER BY a LIMIT 10)UNION(SELECT a FROM tbl_name WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

(SELECT a FROM tbl_name WHERE a=10 AND B=1 ORDER BY a LIMIT 10)UNION(SELECT a FROM tbl_name WHERE a=11 AND B=2 ORDER BY a LIMIT 10);

二 实例扩展

union可以对同一个表的两次查询联合起来. 这样做的益处也非常明显, 比如在blog应用中, 可以利用一条sql语句实现置顶blog和普通blog的分页显示.

代码 复制代码

(

SELECT *

FROM `blog`

WHERE top=1

ORDER BY created DESC

)

UNION (

SELECT *

FROM `blog`

WHERE top = 0

ORDER BY created DESC

)LIMIT 2 , 3

注:union要求联合的两个表所要查找的数据列要一样多,如果一个表中没有另一个表的字段,可以用NULL代替。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值