-
2021-01-18 21:29:22
mysql实现users 表和 logoin_log表是一对多, 现在是把user的信息找出来 关联上一些 logoin_log表的数据, 因为a表是多的一方,要多他的数据进行一些条件匹配,这个sql目的是查出每个用户的最新的log记录
有的人建议进行表连接来进行筛选,不过那样很麻烦,小涛我断然拒绝了,然后我采用了另一个巧妙的方法:
列表的时候采用先查一个表,这里查的是users表,然后再传值到方法,该方法进行封装查询logoin_log,此时要通过id倒序排列,返回相应的值,这样就可以获得最新的log记录了,这样是不是更简单呢,得意……坚决用表连接的盆友们,赶快试试这种方法吧。
users 表和 auth_token_log表是一对多, 现在是把user的信息找出来 关联上一些 www.111cn.net auth_token_log表的数据, 因为a表是多的一方,
要多他的数据进行一些条件匹配
这个sql目的是查出每个用户的最新的log记录
原始写法
代码如下 复制代码
SELECT
users.first_name,
users.email_address,
users.tp_user_id,
users.tp_username,
auth_token_log.module_access,
auth_token_log.created_date
FROM
users
INNER JOIN auth_token_log ON users.id = auth_token_log.user_id
WHERE
auth_token_log.id in(
SELECT
max(id)
FROM
auth_token_log
WHERE
auth_token_log.user_id = users.id
)
自己的理解
代码如下 复制代码
SELECT
users.first_name,
users.email_address,
users.tp_user_id,
users.tp_username,
auth_token_log.module_access,
auth_token_log.created_date
FROM
users
INNER JOIN auth_token_log ON users.id = auth_token_log.user_id
WHERE
auth_token_log.id in(
SELECT
max(auth_token_log.id)
FROM
auth_token_log,
users
WHERE
auth_token_log.user_id = users.id
GROUP BY
users.id
)
对于原始写法的理解是
先查出
代码如下 复制代码
SELECT
×
FROM
users
INNER JOIN auth_token_log ON users.id = auth_token_log.user_id
的记录, 然后针对每一行记录X,拿出这一行X与 一个新的auth_token_log表做join,然后筛选出 log.user_id = x..user.id的所有记录, 然后查出max(id), 这就是最新的log记录的 id
更多相关内容 -
多表联查时的条件筛选
2021-12-14 17:52:17必须先同时符合这两个条件,买回来绿色威化饼干,我们才能谈后续对于它的条件筛选:比如说找到方形的、圆形的、三角形的。 但如果我们先只给On()传输一个“绿色”,我们买回来的是可能是绿色曲奇饼干、绿色苏打饼干...先举个例子,我们去买饼干,我想要的饼干是绿色威化饼干,这时候Left Join On()里就是“绿色”和“威化饼干”两个条件。必须先同时符合这两个条件,买回来绿色威化饼干,我们才能谈后续对于它的条件筛选:比如说找到方形的、圆形的、三角形的。
但如果我们先只给On()传输一个“绿色”,我们买回来的是可能是绿色曲奇饼干、绿色苏打饼干、绿色夹心饼干等。这时再追加一个“威化饼干”的and条件,虽说也会找到一些“绿色威化饼干”,但是会出现许多多余的、错误的饼干,这都是我们不需要的,我们却费劲买回来了。更不要提后续对于饼干大小、形状等其他条件的筛选啦。
理解了这个例子以后,再来看On、Where、And条件也不迟。
在 mapper.xml中填写SQL语句,在<if>标签中加入and条件来拼接,但在拼接and之前要先有个where条件。可以写成where 1 = 1,再给后面拼接其他条件。如果不加where直接拼接and,编译器会认为and后的条件为联合查询时的条件,不能起到过滤作用。
select sl.create_time, sl.username, sl.operate_type, sl.log_content, sdi.item_text from sys_log sl left join sys_dict_item sdi on (sl.operate_type = sdi.item_value and sdi.dict_id = "880a895c98afeca9d9ac39f29e67c13e" ) where 1 = 1 <if test="SysLogTest.username != null"> and username like concat ('%', #{SysLogTest.username}, '%') </if> <if test="SysLogTest.selectCreateTime != null"> and datediff(create_time, #{SysLogTest.selectCreateTime})= 0 </if> <if test="SysLogTest.logContent != null"> and log_content = #{SysLogTest.logContent} </if>
这里我们着重要注意的点是Left Join On()里的联查条件。在此处我们有两种写法,第一种是常规写法,我们先将两张表联合成一张临时表,然后再在其中根据and条件筛选数据:
left join sys_dict_item sdi on (sl.operate_type = sdi.item_value) where 1 = 1 and sdi.dict_id = "880a895c98afeca9d9ac39f29e67c13e" and ......
或者是在on中加入几个先决and条件,先根据on中的条件联合两张表生成一张临时表,然后再在这张临时表中根据and条件筛选:
left join sys_dict_item sdi on (sl.operate_type = sdi.item_value and sdi.dict_id = "880a895c98afeca9d9ac39f29e67c13e") where 1 = 1 and ......
这样写实际上是有区别的,在联查操作中,会先根据Left Join On()中的条件合成一张临时表,再进行后续的查询。第一种写法只会根据 sl.operate_type = sdi.item_value 这个条件,合成临时表,再查询;第二种写法则需要同时符合两个条件,再合成临时表。看起来似乎两者并没有什么区别,但实际上会产生很大的偏差。
这是按照第二种写法生成的正确数据,因为我们给item_text对应了我所需要的dict_id,先根据on()中的两个条件生成了数据表,再生成数据。再做后续的筛选操作,没有任何问题。
但如果我们先生成临时表,表中item_text可能已经不是我所需要的item_text,它指向了错误的dict_id。生成数据时,也就完全不是我想要的,后续的任何操作也都会产生错误。
一定要注意On、Where、And的使用顺序带来的差异。
-
mysql高级查询之多条件的过滤查询
2021-12-30 21:25:37mysql高级查询之多条件的过滤查询一、什么是高级查询:
① 多条件的过滤查询
简单说,即
拼接sql语句
,在sql查询语句之后使用:where 条件1 and/or 条件2 and/or 条件3 …
② 分页查询
二、多条件过滤查询:
1,WHERE 1=1:
是一个永远为true的条件【mysql安全注入漏洞】,通过 1=1 的条件,避免判断where后边应该接收那个字段【考虑到拼接的几个字段都为空】。
StringBuilder sql = new StringBuilder(); sql.append(" WHERE 1=1"); // 拼接姓名 if (StringUtils.isNotBlank(name)) { sql.append(" AND name LIKE ?"); parameters.add("%" + name + "%"); } // 拼接最小年龄 if (minAge != null) { sql.append(" AND age >= ?"); parameters.add(minAge); }
2、WHERE 1=1 问题:影响性能,因为不能使用
索引查询
了。解决where 1=1 索引问题【定义一个容器,当容器放进了条件,
取出容器的条件
(第一个条件前拼接上where,其他拼接and)】sql.append(" WHERE "); //利用Apached 的组件 Apache commons-lang 组件:StringUtils的join方法:把集合中每个元素使用特定的字符串连接起来 sql.append(StringUtils.join(conditions, " AND "));
3、思维:封装与职责分离
1:封装:参数过多应该封装成一个对象
2:职责分离:谁拥有该数据,谁就应该包含操作该数据的方法
4、关键字查询(从多个列中做查询)
例如:查询商品名称中或者商品品牌中带有’中国’。
细节:
AND的优先级高于OR
关键字查询的多列查询拼接sql
要记得使用()括起来//暴露给子类:让子类在customizedQuery中调用,添加字节的查询条件和参数 protected void addQuery(String condition, Object... param) { //细节:不定长的参数是数组----集合parameters.add(数组)是将数组作为一个元素添加进来 //解决:先将数组转成集合,然后集合parameters.addAll(集合) this.conditions.add(condition); this.parameters.addAll(Arrays.asList(param)); } //拼接关键词 if (keyword != null) { super.addQuery("(name LIKE ? OR dormBuildId LIKE ?)","%" + keyword + "%", "%" + keyword + "%"); }
-
mysqldump 备份多张相关联的表,并且执行有条件的筛选
2011-04-05 15:22:03总结关于 mysqldump 多张表筛选备份的使用方法 -
oracle 同时查询多张表 多张视图
2021-05-03 02:42:32oracle同时查询多张表较为简单,用sql和视图都可以完成,但是oracle查询多张视图就不好做了,要是还有分页和检索的功能就更加蛋疼了,今天老夫遇到了这样的问题,接下来就和大伙分享下://分页的语句String fenyeSql...oracle同时查询多张表较为简单,用sql和视图都可以完成,但是oracle查询多张视图就不好做了,要是还有分页和检索的功能就更加蛋疼了,今天老夫遇到了这样的问题,接下来就和大伙分享下:
//分页的语句
String fenyeSql_1 = "SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (";
String fenyeSql_2 = " ) A WHERE ROWNUM <= " + end + " ) WHERE RN >= " + from + " ";
//查询条数的语句
String fenyeCountSql_1 = " select count(*) from ( ";
String fenyeCountSql_2 = " ) ";
String union = " union ";
//第一张视图
String sql_gjy_select = " select to_char(t.xm) xm,to_char(t.xb) xb,t.qslc qslc,t.zzlc ,to_char(t.检查日期) 检查日期,to_char(t.上传时间) 上传时间,t.上传单位,t.路局名,t.jcsbid sclx from v$gwsj_jcsjlx t where 1=1 ";
//第二张视图
String sql_tqi_select = " select t2.xm xm,t2.xb xb,t2.qslc qslc,t2.zzlc,to_char(t2.检查日期,'yyyy-MM-dd') 检查日期,to_char(t2.上传时间,'yyyy-MM-dd') 上传时间,t2.上传单位,t2.路局名,4 sclx from v$tqi_line t2 where 1=1 ";
//第三张视图
String sql_g4d_select = " select t3.xm xm,t3.xb xb,t3.qslc qslc,t3.zzlc,t3.检查日期 检查日期,to_char(t3.上传时间,'yyyy-MM-dd') 上传时间,t3.上传单位,t3.路局名,5 sclx from v$g4d_line t3 where 1=1 ";
//注意三张视图的数据类型要转换一致,而且列的数量要一样哦
//接下来就是蛋疼的凭借sql
// 条件1
if (null != year && null != month && !"".equals(year)
&& !"".equals(month)) {
String selectDate = year + "-";
if (month.toCharArray().length == 1) {
selectDate += "0" + month;
} else if (month.toCharArray().length == 2) {
selectDate += month;
}
sql_gjy_select += " and t.检查日期 like '%" + selectDate + "%'";
sql_tqi_select += " and t2.检查日期 like '%" + selectDate + "%'";
sql_g4d_select += " and t3.检查日期 like '%" + selectDate + "%'";
}
//条件2
if (null != fdwbh && !"".equals(fdwbh)) {
sql_gjy_select += " and t.上传单位='" + fdwbh + "'";
sql_tqi_select += " and t2.上传单位='" + fdwbh + "'";
sql_g4d_select += " and t3.上传单位='" + fdwbh + "'";
}
//
//
中间条件省略若干的
//
//
// 查询数据
String sql_select = fenyeSql_1 + sql_gjy_select + union
+ sql_tqi_select + union + sql_g4d_select + fenyeSql_2;
// 对应总条数
String sql_count = fenyeCountSql_1 + sql_gjy_select + union
+ sql_tqi_select + union + sql_g4d_select + fenyeCountSql_2;
PreparedStatement ps = null;
String permissionJson = null;
//接下来我就不多说了,该怎么干就怎么干吧
寡人qq 545923664 有事多联系,仅限妙龄女子~0.0
-
left join 关联多张表 添加条件
2020-06-08 10:06:44workflow_requestbase d 和上述三张表存在筛选关系 a.requestid=d.requestid and d.currentnodetype=3 //人员表 hrmresource id=上述三张表.人员 需要 格式 人员、累计借款金额 sum(c.jkje)、累计还款金额sum(a.... -
将第一张表查询出的结果作为关联条件,修改第二张表数据
2020-05-09 13:53:18UPDATE ftms_iov_car_info fici INNER JOIN ( SELECT fieu.id, fieu.enterprise_code FROM ftms_iov_enterprise_user fieu WHERE fieu.type = 2 AND fieu.del_flag = 0 ) f ON fici.enterprise_code = f.... -
存储过程一个表查询出来的数据到另一种张表筛选查询
2021-03-09 16:15:38-- 游标的所有数据 if lp_flag then -- 判断是否继续循环 SELECT start_time,end_time,sub_ratio,currency_count,SUM(profit) profit -- 表A 数据 到 表B筛选 into start_time,end_time,sub_ratio,currency_... -
数据库07——条件查询和多表查询
2021-07-29 22:17:59数据库06——条件查询和多表查询 查询条件之——having # having的功能与where一样 where 在分组之前用, where中写的条件必须在表中存在 having 在分组之后用 # 查询每个部门中大于30岁的平均工资,并且,保留中... -
mysql实现查询数据并根据条件更新到另一张表的方法示例
2020-09-09 04:53:35主要介绍了mysql实现查询数据并根据条件更新到另一张表的方法,结合实例形式分析了mysql多表关联查询、更新等相关操作技巧,需要的朋友可以参考下 -
JDBC动态查询MySQL中的表(按条件筛选)
2018-09-27 19:48:00动态查询实现按条件筛选。PreparedStatement 准备语句指定要查询的表头列,.setString()通过赋值指定行,.executeQuery()执行语句 在数据库test里先创建表school,内容如下 import java.sql.*; public ... -
SQL中COUNT()筛选条件查询
2021-07-10 15:14:56我自己摸索出来两种,其他的统计都差不多 dept=10 的加1 不能省去or null 不然会变成 总和 select count ( dept = '10' or null) from dept 如果满足dept=10 则加1 否则为null(切记不能不能为0,为0的话会统计总和... -
动态Sql语句,筛选查询,根据满足某个条件筛选、字段数据迁移数据恢复
2022-05-17 09:04:39=0"> 如果这个条件满足,不至于丢失where and id=#{id} </if> </select> org.apache.ibatis.annotations.Param注解 数据匹配 解释 在mybatis的Map类中,方法参数为多个时,前面一般需要加上@Param注解,例如 ... -
程序员的小工具,用python操作excel表格 --- 可用于多张表的数据对比筛选等。
2022-08-08 16:50:16读入数据 总结 前言 遇到excel数据过多,对比筛选数据条件复杂,本文的主要思路是将表中的数据取出进行处理后生成新的表。 一、先安装环境 推荐直接用pycharm,下载地址:Download PyCharm: Python IDE for ... -
连接查询(外连接)(三张表连接查询)
2020-02-16 16:08:38假设A和B进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要是查询 主表中的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出N ULL与之匹配。 外连接分类? 左... -
JPA的多表复杂查询筛选:详细篇
2020-02-28 19:22:38最近工作中由于要求只能用hibernate+jpa 与数据库进行交互,在简单查询中,jpa继承CrudRepository接口 ,然后利用jpa的方法命名规范进行jpql查询,然而在进行复杂查询时,需要继承JpaSpecificationExecutor接口利用... -
从一个表中筛选包含多条数据的条件查询
2018-01-08 14:53:48需求如下: a商店有:1,2,3,4,5,6标识 b商店有:1,5,6标识 c商店有:4,5,6标识 每个标识都有一条记录 每条记录如下: a-->1 a-->2 ...那么我现在要收索同时拥有标识有4,5,6的商店:搜出来的商店应该是... -
spark读取hbase中的多张表,通过scan方式来筛选出想要的信息
2019-06-04 19:40:03// 按照日期列表读出多个RDD存在一个Set中,再用SparkContext.union()合并成一个RDD var rddSet: Set[RDD[(org.apache.hadoop.hbase.io.ImmutableBytesWritable, org.apache.hadoop.hbase.client.Result)] ] = Set... -
SQL学习(8):多表连接+WHERE筛选适用情况
2022-07-01 15:37:30SQL学习(8):多表连接+WHERE筛选适用情况 条件v结果——1v1或1vN -
MySQL多表查询大全(超精确)
2022-04-29 11:03:38如果我们要查询的数据分布在不同的表时,那么需要连接多张表进行多表查询。 --而这些表当中,必须存在主外键关系(直接关联) --如果不存在直接关系,则必定存在间接关系,否则业务上是没有意义的 1、等值查询 ... -
MySQL-复杂查询及条件-起别名-多表查询-04
2021-01-18 22:29:14基本查询语句及方法测试数据创建如果在windows系统中,插入中文字符,select的结果为空白,可以将所有字符编码统一设置成gbk(或者参照我安装配置MySQL的博客,将所有字符编码设置为 utf8)创建数据库与表create ... -
MySQL--多表连接查询
2021-12-26 10:55:46多表连接查询,简述表之间的关系,以及笛卡尔积查询方式和子查询方式 -
JPA的多表复杂查询的方法示例
2020-08-25 18:44:59主要介绍了JPA的多表复杂查询的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 -
SQL基础系列(四)——多表查询
2022-04-22 14:06:31本部分内容包括如何使用2张以上的表如何进行...联表是将多张表进行横向联结,将其他表中的列添加过来。 (1)我们想要的效果如下: 表A-学生表(students): 学生ID(stu_id) 学生名称(stu_name) 班级(class) -
Excel 高级筛选实现多条件筛选数据
2019-12-25 16:41:36实际场景: 需要在几百张表中筛选出需要更新的表结构的几十张表,如果使用普通筛选方式只能一次次筛选复制,重复操作! So,这个时候就需要excel的高级筛选功能来大展身手了。 但是这个时候会遇到最大的阻碍... -
MySQL联合查询(多表查询)
2022-07-30 19:52:192.过滤笛卡尔积中无意义...select*from表1[inner|cross]join表2[on过滤条件][where查询条件];3.select*from表1innerjoin表2[on过滤条件][where查询条件];1.select*from表1join表2[on过滤条件][where查询条件];... -
MySQL查询数据表中数据记录(包括多表查询)
2020-12-19 15:37:34MySQL查询数据表中数据记录(包括多表查询)在MySQL中创建数据库的目的是为了使用其中的数据。使用select查询语句可以从数据库中把数据查询出来。select语句的语法格式如下:select selection_list // 要查询的内容,... -
MySQL (六) : 多表查询
2022-04-06 10:36:32前提条件:这些一起查询的表之间是有关系的(一对一、一对多),它们之间一定是有关联字段,这个关联字段可能建立了外键,也可能没有建立外键。比如:员工表和部门表,这两个表依靠“部门编号”进行关联。 1. 一个... -
MySql多表查询优化
2021-01-18 21:21:22一、多表查询连接的选择相信内连接,左连接什么的大家都比较熟悉了,当然还有左外连接什么的,基本用不上,我就补贴出来了,这个图只是让大家熟悉一下各种连接查询。然后要告诉大家的是,需要根据查询的信息,想好... -
多表查询与索引
2021-01-18 23:05:10那么就需要俩张表进行连接查询,多表查询.外链接 语法select 字段列表from 表1 inner/left/right join 表2 on 表1.字段 = 表2.字段;第一种情况交叉连接: 不适用任何匹配条件.生成笛卡尔积.mysql> select * from...