精华内容
下载资源
问答
  • 多张表查询时的条件筛选
    千次阅读
    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高级查询多条件的过滤查询

    一、什么是高级查询:

    ① 多条件的过滤查询

    简单说,即拼接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 多张表筛选备份的使用方法
  • oracle同时查询多张表较为简单,用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

    展开全文
  • workflow_requestbase d 和上述三张表存在筛选关系 a.requestid=d.requestid and d.currentnodetype=3 //人员表 hrmresource id=上述三张表.人员 需要 格式 人员、累计借款金额 sum(c.jkje)、累计还款金额sum(a....
  • UPDATE 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....
  • -- 游标的所有数据 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_...
  • 数据库06——条件查询查询 查询条件之——having # having的功能与where一样 where 在分组之前用, where中写的条件必须在表中存在 having 在分组之后用 # 查询每个部门中大于30岁的平均工资,并且,保留中...
  • 主要介绍了mysql实现查询数据并根据条件更新到另一张表的方法,结合实例形式分析了mysql表关联查询、更新等相关操作技巧,需要的朋友可以参考下
  • 动态查询实现按条件筛选。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的话会统计总和...
  • =0"> 如果这个条件满足,不至于丢失where and id=#{id} </if> </select> org.apache.ibatis.annotations.Param注解 数据匹配 解释 在mybatis的Map类中,方法参数为,前面一般需要加上@Param注解,例如 ...
  • 读入数据 总结 前言 遇到excel数据过多,对比筛选数据条件复杂,本文的主要思路是将表中的数据取出进行处理后生成新的表。 一、先安装环境 推荐直接用pycharm,下载地址:Download PyCharm: Python IDE for ...
  • 假设A和B进行连接,使用外连接的话,AB两张表中有一张表是主表,一张表是副表,主要是查询 主表中的数据,捎带着查询副表,当副表中的数据没有和主表中的数据匹配上,副表自动模拟出N ULL与之匹配。 外连接分类? 左...
  • 最近工作中由于要求只能用hibernate+jpa 与数据库进行交互,在简单查询中,jpa继承CrudRepository接口 ,然后利用jpa的方法命名规范进行jpql查询,然而在进行复杂查询时,需要继承JpaSpecificationExecutor接口利用...
  • 需求如下: a商店有:1,2,3,4,5,6标识 b商店有:1,5,6标识 c商店有:4,5,6标识 每个标识都有一条记录 每条记录如下: a-->1 a-->2 ...那么我现在要收索同时拥有标识有4,5,6的商店:搜出来的商店应该是...
  • // 按照日期列表读出个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筛选适用情况 条件v结果——1v1或1vN
  • MySQL查询大全(超精确)

    千次阅读 2022-04-29 11:03:38
    如果我们要查询的数据分布在不同的表,那么需要连接多张表进行查询。 --而这些表当中,必须存在主外键关系(直接关联) --如果不存在直接关系,则必定存在间接关系,否则业务上是没有意义的 1、等值查询 ...
  • 基本查询语句及方法测试数据创建如果在windows系统中,插入中文字符,select的结果为空白,可以将所有字符编码统一设置成gbk(或者参照我安装配置MySQL的博客,将所有字符编码设置为 utf8)创建数据库与表create ...
  • MySQL--表连接查询

    2021-12-26 10:55:46
    表连接查询,简述表之间的关系,以及笛卡尔积查询方式和子查询方式
  • 主要介绍了JPA的表复杂查询的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
  • 本部分内容包括如何使用2张以上的表如何进行...联表是将多张表进行横向联结,将其他表中的列添加过来。 (1)我们想要的效果如下: 表A-学生表(students): 学生ID(stu_id) 学生名称(stu_name) 班级(class)
  • Excel 高级筛选实现多条件筛选数据

    千次阅读 2019-12-25 16:41:36
    实际场景: 需要在几百张表筛选出需要更新的表结构的几十张表,如果使用普通筛选方式只能一次次筛选复制,重复操作! So,这个时候就需要excel的高级筛选功能来大展身手了。 但是这个时候会遇到最大的阻碍...
  • 2.过滤笛卡尔积中无意义...select*from表1[inner|cross]join表2[on过滤条件][where查询条件];3.select*from表1innerjoin表2[on过滤条件][where查询条件];1.select*from表1join表2[on过滤条件][where查询条件];...
  • MySQL查询数据表中数据记录(包括查询)在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...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 19,066
精华内容 7,626
关键字:

多张表查询时的条件筛选