mapper语句的一些问题,union连表查询和mapper中根据条件不同采用不同语句的查询问题
根据业务要求,不同表查出来的内容天需要一起展示出来,并且还有分页之类的,不同表查询字段也不完全相同,这样就有一个问题,不同表如何接合在一起,不同字段怎么办?
这个问题就需要用到union联合查询,并将不同字段采用共有字段去展示,在前台显示则需要根据其他字段去判断展示,就达到目的了。但是由于本业务比较复杂,需要根据传入的不同值,分别进行不同查询,有联合的,非联合的等,在一个<select></select>标签下搞不定,代码如下:
<select id="userSelectMessageList" parameterType="map" resultMap="BaseResultMap">
<if test="messageType!=null and messageType=0">
SELECT <include refid="User_Base_Column_List"/>,t.deviceNum `number`,a.`user_name` `name` FROM t_message m INNER JOIN
(SELECT COUNT(d.`device_id`) deviceNum,d.`order_id`,o.`account_id` FROM `xxx_order_device` d INNER JOIN xxx_order o ON d.`order_id`=o.`id` WHERE d.`del_flag`=0 AND o.`del_flag`=0 GROUP BY d.`order_id`, o.`account_id`) t
ON m.`value1`=t.`order_id` INNER JOIN u_account a ON t.`account_id`=a.`id` WHERE info_type=12
AND m.`company_id`=#{companyId} AND m.`product_id`=#{productId}
<if test="content!=null">
AND (d.`device_name` LIKE #{content} OR d.`model` LIKE #{content})
</if>
UNION
SELECT <include refid="User_Base_Column_List"/>, d.model `number`, d.device_name `name` FROM t_message m INNER JOIN xxx_device_repair gdr ON m.value1=gdr.id INNER JOIN d_device d ON d.id=gdr.device_id WHERE info_type=16
AND m.`company_id`=#{companyId} AND m.`product_id`=#{productId}
<if test="content!=null">
AND (d.`device_name` LIKE #{content} OR d.`model` LIKE #{content})
</if>
</if>
<if test="messageType!=null and messageType=12">
SELECT <include refid="User_Base_Column_List"/>,t.deviceNum `number`,a.`user_name` `name` FROM t_message m INNER JOIN
(SELECT COUNT(d.`device_id`) deviceNum,d.`order_id`,o.`account_id` FROM `xxx_order_device` d INNER JOIN xxx_order o ON d.`order_id`=o.`id` WHERE d.`del_flag`=0 AND o.`del_flag`=0 GROUP BY d.`order_id`, o.`account_id`) t
ON m.`value1`=t.`order_id` INNER JOIN u_account a ON t.`account_id`=a.`id` WHERE info_type=12
AND m.`company_id`=#{companyId} AND m.`product_id`=#{productId}
<if test="content!=null">
AND (d.`device_name` LIKE #{content} OR d.`model` LIKE #{content})
</if>
</if>
<if test="messageType!=null and messageType=16">
SELECT <include refid="User_Base_Column_List"/>, d.model `number`, d.device_name `name` FROM t_message m INNER JOIN xxx_device_repair gdr ON m.value1=gdr.id INNER JOIN d_device d ON d.id=gdr.device_id WHERE info_type=16
AND m.`company_id`=#{companyId} AND m.`product_id`=#{productId}
<if test="content!=null">
AND (d.`device_name` LIKE #{content} OR d.`model` LIKE #{content})
</if>
</if>
</select>
查询的结果总是报错,最主要是控制台打印出来的语句全有,并且中间没有union 关键字连接,
最后不得已只能将其拆分,然后在service层中根据messageType的不同来控制不同查询。
代码如下:
<sql id="User_Base_Column_List">
m.id, m.uid, m.user_id, m.family_id,
m.device_id, m.info_type, m.type, m.time, m.value1, m.product_id, m.company_id ,
m.text, m.create_time, m.update_time, m.del_flag
</sql>
<select id="userSelectMessageList0" parameterType="map" resultMap="BaseResultMap">
SELECT <include refid="User_Base_Column_List"/>,t.deviceNum `number`,a.`user_name` `name` FROM t_message m INNER JOIN
(SELECT COUNT(d.`device_id`) deviceNum,d.`order_id`,o.`account_id` FROM `xxx_order_device` d INNER JOIN xxx_order o ON d.`order_id`=o.`id` WHERE d.`del_flag`=0 AND o.`del_flag`=0 GROUP BY d.`order_id`, o.`account_id`) t
ON m.`value1`=t.`order_id` INNER JOIN u_account a ON t.`account_id`=a.`id` WHERE info_type=12
AND m.`company_id`=#{companyId} AND m.`product_id`=#{productId}
<if test="content!=null">
AND (d.`device_name` LIKE #{content} OR d.`model` LIKE #{content})
</if>
UNION
SELECT <include refid="User_Base_Column_List"/>, d.model `number`, d.device_name `name` FROM t_message m INNER JOIN xxx_device_repair gdr ON m.value1=gdr.id INNER JOIN d_device d ON d.id=gdr.device_id WHERE info_type=16
AND m.`company_id`=#{companyId} AND m.`product_id`=#{productId}
<if test="content!=null">
AND (d.`device_name` LIKE #{content} OR d.`model` LIKE #{content})
</if>
</select>
<select id="userSelectMessageList12" parameterType="map" resultMap="BaseResultMap">
SELECT <include refid="User_Base_Column_List"/>,t.deviceNum `number`,a.`user_name` `name` FROM t_message m INNER JOIN
(SELECT COUNT(d.`device_id`) deviceNum,d.`order_id`,o.`account_id` FROM `xxx_order_device` d INNER JOIN xxx_order o ON d.`order_id`=o.`id` WHERE d.`del_flag`=0 AND o.`del_flag`=0 GROUP BY d.`order_id`, o.`account_id`) t
ON m.`value1`=t.`order_id` INNER JOIN u_account a ON t.`account_id`=a.`id` WHERE info_type=12
AND m.`company_id`=#{companyId} AND m.`product_id`=#{productId}
<if test="content!=null">
AND (d.`device_name` LIKE #{content} OR d.`model` LIKE #{content})
</if>
</select>
<select id="userSelectMessageList16" parameterType="map" resultMap="BaseResultMap">
SELECT <include refid="User_Base_Column_List"/>, d.model `number`, d.device_name `name` FROM t_message m INNER JOIN xxx_device_repair gdr ON m.value1=gdr.id INNER JOIN d_device d ON d.id=gdr.device_id WHERE info_type=16
AND m.`company_id`=#{companyId} AND m.`product_id`=#{productId}
<if test="content!=null">
AND (d.`device_name` LIKE #{content} OR d.`model` LIKE #{content})
</if>
</select>
如此这般,得以解决,推测有可能是一个select标签下只能运行一个主select语句。
mapper语句的一些问题,union连表查询和mapper中根据条件不同采用不同语句的查询问题的更多相关文章
- Shell中的条件测试和循环语句
1.条件测试:test或[ 如果测试结果为真,则该命令的Exit Status为0,如果测试结果为假,则命令的Exit Status为0 运行结果: 带与.或.非的测试命令[ ! EXPR ] : E ...
- Python中的条件选择和循环语句
一.条件选择语句 Python中条件选择语句的关键字为:if .elif .else这三个.其基本形式如下: if condition: block elif condition: block ... ...
- 查询各个商品分类中各有多少商品的SQL语句
SELECT goods_category_id ,count(*) FROM `sw_goods` group by goods_category_id
- 【存储过程】用SQL语句获得一个存储过程返回的表
定义一个存储过程如下: create proc [dbo].[test1] @id int as select 1 as id,'abc' as name union all select @id a ...
- SQL语句汇总(终篇)—— 表联接与联接查询
既然是最后一篇那就不能只列出些干枯的标准语句,更何况表联接也是SQL中较难的部分,所以此次搭配题目来详细阐述表联接. 上一篇博文说到相关子查询效率低下,那我们怎么能将不同表的信息一起查询出来呢?这就需 ...
- 数据库常用SQL语句(二):多表连接查询
前面主要介绍了单表操作时的相关查询语句,接下来介绍一下多表之间的关系,这里主要是多表数据记录的查询,也就是如何在一个查询语句中显示多张表的数据,这也叫多表数据记录的连接查询. 在实现连接查询时,首先是 ...
- 怎样用SQL语句查询一个数据库中的所有表?
怎样用SQL语句查询一个数据库中的所有表? --读取库中的所有表名 select name from sysobjects where xtype='u'--读取指定表的所有列名select nam ...
- Oracle Update 语句语法与性能分析 - 多表关联
Oracle Update 语句语法与性能分析 - 多表关联 为了方便起见,建立了以下简单模型,和构造了部分测试数据: 在某个业务受理子系统BSS中, SQL 代码 --客户资料表 create ...
- 转: 从Mysql某一表中随机读取n条数据的SQL查询语句
若要在i ≤ R ≤ j 这个范围得到一个随机整数R ,需要用到表达式 FLOOR(i + RAND() * (j – i + 1)).例如, 若要在7 到 12 的范围(包括7和12)内得到一个随机 ...
随机推荐
- 随机游走模型(Random Walk)
给定了一个时间顺序向量\(z_1,...,z_T\),rw模型是由次序r来定义的,\(z_t\)仅取决于前\(t-r\)个元素.当r = 1时为最简单的RW模型. 给定了向量的其他元素,\(z_t\) ...
- mysql innodb cluster 无感知集群
MySQL 8.0.12 innodb cluster 高可用集群部署运维管理手册 Innodb cluster 原理介绍 Innodb cluster 利用组复制的 pxos 协议,保障数据一致性 ...
- 特约稿件 Java并发教程(Oracle官方资料)
本文是Oracle官方的Java并发相关的教程,感谢并发编程网的翻译和投递. (关注ITeye官微,随时随地查看最新开发资讯.技术文章.) 计算机的使用者一直以为他们的计算机可以同时做很多事情.他 ...
- UniCode 速查表
unicode速查表 0000–0FFF 1000–1FFF 2000–2FFF 3000–3FFF 4000–4FFF 5000–5FFF 6000–6FFF 7000–7FFF 8000–8FFF ...
- Adroid ViewPage+GridView实现每页6个元素,三页滑动切换
//}//public class MainActivity extends Activity {// private static final float APP_PAGE_SIZE = 16.0f ...
- 横竖屏切换Activity的生命周期
横竖屏切换的时候Activity的生命周期如下: 1.新建一个Activity,并把各个生命周期打印出来 2.运行Activity,得到如下信息 onCreate--> onStart--> ...
- ActivePerl 安装
下载 https://www.activestate.com/products/activeperl/downloads/ 链接:https://pan.baidu.com/s/1IXPdYFd5bD ...
- windows下用libevent 开发一个echo服务
#include <stdio.h> #include <string.h> #include <errno.h> #include <iostream> ...
- 「PA2014」Fiolki
传送门 Bzoj 解题思路 构造法. 对于每一次的倾倒操作,连边 \(newnode\to u,newnode\to v\). 最后所有的反应都会在构造出来的树上的对应两点的 \(\text{LCA} ...
- vue中使用矢量图
1.打开矢量图库,将需要的图表添加至购物车 2.将购物车的图标添加到一个项目中(便于后期增加更新)并下载至本地 3.将这四个文件及iconfont.css添加至项目的assets中 4.打开iconf ...