mysql多条语句union_Mysql同时执行多个select语句——union

本文介绍了在MySQL中如何使用UNION关键字来合并执行多个SELECT语句,适用于需要同时查询不同条件但列数相同的数据。通过示例和代码解释了UNION的使用细节,包括对重复行的处理、查询效率以及在实际项目中的应用。
摘要由CSDN通过智能技术生成

前言

今天小编在改bug的时候遇到一个既简单又让人头疼的问题,由于底层封装的执行sql语句的方法中没有合适我的,所以我只能在我的D层动手脚了……

经验

下面来说说我今天的情况:

我们新建一个抽奖活动的时候需要绑定奖品,在绑定的时候肯定要去奖品池里查看一下我们填的这个奖品ID是否存在,如果存在就可以添加,不存在的话需要先去添加奖品,再进行绑定。由于我的奖品信息是可以动态添加多条的,所以我在进行查询的时候,传入的是一个奖品ID的数组,然后去依次的查询。之前使用的是一个for循环的语句,直接调的底层方法去查询,但是这个底层方法并不是我们想要的样子,是当这个查询语句没问题的时候就会返回true,只有发生异常的时候才会返回false,所以明显跟我们的需求不对应。所以我只能换了一种方法,动态拼接select语句……

分享

思路到了这就开始执行了,但是语句拼好了,那么当多个奖品的时候,我要怎么同时执行这些select语句呢?后来查到了可以使用union关键字来进行联合查询,下面我就开始给大家分享一下……

1、union:联合的意思,即把两次或多次查询结果合并起来。

2、   要求:两次查询的列数必须一致

3、 可以来自多张表的数据:多次sql语句取出的列名可以不一致,此时以第一个sql语句的列名为准

4、union会去掉重复的行,如果想保留重复的行,需要使用union all

5、如果子句中有order by,limit,需用括号()包起来。推荐放到所有子句之后,即对最终合并的结果来排序或筛选

例:(select * from a order by id) union (select * from b order id);

6、在子句中,order by 需要配合limit使用才有意义。如果不配合limit使用,会被语法分析器优化分析时去除

7、如果查询两个表中数据,两个表的字段是不一样的,

table1: (id,createDate,lastUpdateDate,desc,num,hashCode),

table2: (id,createDate,lastUpdateDate,desc)

如果现在使用: select * from table1 UNION ALL select * from table2 则是不会成功的, 数据库为报:

Error  The used SELECT statements have a different number of columns

这是提示查询的两张表的字段不统一,如果table1比table2的字段内容多,可以使用空字符串来代替:

select id,createDate,lastUpdateDate,desc,num,hashCode from table1 UNION ALL select                                             id,createDate,lastUpdateDate,desc,'','' from table2

如果里面有不想要的,千万要记住前面查询内容要和后面查询内容的字段个数要一样,前面你查询4个,后面也要相应的放4个,这样就不会提示参数数量不同的错误了。

8、从效率上说,UNION ALL 要比UNION快很多,所以,如果可以确认合并的两个结果集中不包含重复的数据的话,那么就使用UNION ALL。

下面小编放上自己项目中的代码,以便大家借鉴:

public static bool Selectrewardinfo(string[] RewardIDstr1)

{

StringBuilder sbSql1 = new StringBuilder();

for (int i = 0; i < RewardIDstr1.Length - 1; i++)

{

sbSql1.Append("SELECT RewardID FROM ta_reward_info WHERE RewardID = ");

sbSql1.Append("'" + RewardIDstr1[i] + "'union");

}

sbSql1.Append(" SELECT RewardID FROM ta_reward_info WHERE RewardID = ");

sbSql1.Append("'" + RewardIDstr1[RewardIDstr1.Length - 1] + "'");

string sql = sbSql1.ToString();

List List = GetList1(sql);

bool flag;

if (List.Count < RewardIDstr1.Length)

{

flag = false;

}

else

{

flag = true;

}

return flag;

}

总结

经历了这么多,小编总结出来的只有一句话,那就是——方法总比问题多!没有我们解决不了的问题!加油~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值