如何在子查询中实现多列过滤

什么是子查询:

  当一个查询是另外一个查询的条件,称之为子查询。

常见子查询使用场景:

  1.使用子查询可以避免由于子查询中的数据产生的重复。

  2.使用子查询更符合语义,更好理解

-- 子查询user_id 重复时,不会导致结果重复
select user_name from qujing where id in (select user_id from user_kills);

-- 使用join时,会重复
select a.user_name from qujing a join user_kills b on a.id =b.user_id;

-- 使用distinct去除重复记录
select distinct a.user_name from qujing a join user_kills b on a.id =b.user_id;

如何在子查询中实现多列过滤:

步骤1:

SELECT
    user_id,
    MAX(kills)
FROM
    user_kills
GROUP BY
    user_id

步骤2:

SELECT
    a.user_name,
    b.timestr,
    kills
FROM
    qujing a
JOIN user_kills b ON a.id = b.user_id
WHERE
    (b.user_id, b.kills) IN (
        SELECT
            user_id,
            MAX(kills)
        FROM
            user_kills
        GROUP BY
            user_id
    );

原文地址:https://www.cnblogs.com/ooo0/p/12252841.html

时间: 2024-10-08 17:27:17

如何在子查询中实现多列过滤的相关文章

子查询中包含不存在的列--居然不是bug!

1.现象 create table a as (select 1 as col_a); create table b as (select 2 as col_b)  select *  from a  where col_a in (select col_a from b) 其中,col_a只存在于table_a中,table_b中没有该字段,整条语句的结果是可以成功执行! 2.原因: 这个问题比较困惑,网上搜到的原因是"当子查询中的列名不存在时,自动向外层寻找". 也就是说,上面的查

子查询中的NULL问题

子查询返回有单行,多行和null值:适用于单行子查询的比较运算符是=,>,>=,<,<=<>和!=.适用于多行子查询的比较运算符是in,not in,any和any.在子查询中不可回避的是会返回null值,下面就这个问题来讨论一下. 在单行子查询中 SQL> select last_name,department_id from employees where department_id is null; LAST_NAME DEPARTMENT_ID -----

子查询中不能使用limit或者in

select * from  wechat_account_info  where id in(select id from wechat_account_info where groupId ='8' ORDER BY id limit 15  ) as s 此句执行中会出现如下错误: [Err] 1235 - This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery' 原因: MYSQL子查询不支持

oracle子查询中not in后面不能为null值的理解

首先说说oracle中的null值吧. null在oracle中代表未知,表示可能有,也可能没有.任何与null值的普通运算都为null,但可以用一些函数来处理null值,oracle排序中默认null最大. 接着进入正文 这里in后面有null,能返回数据 但加了not后,就不能返回数据了 这里的in后面的句子可以理解为or拼接,即 id in (200,201,null)可以等价于id=200 or id=201or id=null, id not in (200,201,null)可以等价

mysql 子查询中 使用 limit

如果sql语句中的子查询包含limit 例如: select * from a where id in (select id from b limit 3) 会报错:This version of MySQL doesn’t yet support ‘LIMIT & IN/ALL/ANY/SOME subquery' # 解决办法: 1.加一层子查询 例如:select * from a where id in (select t.id from (select id from b limit

thinkphp3.2.3子查询中遇到的错误

使用buildSql方法 $subQuery = $model->field('id,name')->table('tablename')->group('field')->where($where)->order('status')->buildSql(); $model->table($subQuery.' a')->where()->order()->select(): 当我们把里面的.' a'去掉时运行会出现错误,因为每个派生出来的表(即

子查询中可以包含order by 子句--(在from里面)

select a.* from dept a where a.deptno in (select b.deptno from emp b order by b.deptno)  --在where后面报错: ORA-00907: missing right parenthesis ; --from后面的视图是内联视图,可以使用order by --如上报错语句再嵌套一层变成from后面的内联视图就好了 --例如: select a.* from dept a where a.deptno in (

SQL语句汇总(三)——聚合函数、分组、子查询及组合查询 - Darly

–COUNT:统计行数量 –SUM:获取单个列的合计值 –AVG:计算某个列的平均值 –MAX:计算列的最大值 –MIN:计算列的最小值 首先,创建数据表如下: 执行列.行计数(count): 标准格式 SELECT COUNT(<计数规范>) FROM <表名> 其中,计数规范包括: - * :计数所有选择的行,包括NULL值: - ALL 列名:计数指定列的所有非空值行,如果不写,默认为ALL: - DISTINCT 列名:计数指定列的唯一非空值行. 例,计算班里共有多少学生:

SQL语句:子查询

一,子查询定义: 子查询就是嵌套在主查询中的查询. 子查询可以嵌套在主查询中所有位置,包括SELECT.FROM.WHERE.GROUP BY.HAVING.ORDER BY. 但并不是每个位置嵌套子查询都是有意义并实用的. 二,子查询的返回: 一个子查询会返回一个标量(单一值).一个行.一个列或一个表(一行或多行及一列或多列).这些子查询被称为标量.列.行和表子查询 1,单行单列,聚合(标量): 返回的结果集为单个的子查询,叫做单行子查询.单行比较符有: =. >.>=.<.<=