专栏首页卯金刀GG【MYSQL分组查询前1或者前几名排名】

【MYSQL分组查询前1或者前几名排名】

测试库表:

CREATE TABLE test(NAME VARCHAR(10),val INT,memo VARCHAR(20)); 
INSERT INTO test VALUES('a', 2, 'a2--a的第二个值') ;
INSERT INTO test VALUES('a', 1, 'a1--a的第一个值') ;
INSERT INTO test VALUES('a', 3, 'a3--a的第三个值') ;
INSERT INTO test VALUES('b', 1, 'b1--b的第一个值') ;
INSERT INTO test VALUES('b', 3, 'b3--b的第三个值') ;
INSERT INTO test VALUES('b', 2, 'b2--b的第二个值') ;
INSERT INTO test VALUES('b', 4, 'b2--b的第四个值') ;
INSERT INTO test VALUES('b', 5, 'b2--b的第五个值') ;
go

查询:

--方法1:
SELECT 
  a.* 
FROM
  test a 
WHERE val = 
  (SELECT 
    MAX(val) 
  FROM
    test 
  WHERE NAME = a.name) 
ORDER BY a.name; 
--方法2: 
SELECT 
  a.* 
FROM
  test a 
WHERE NOT EXISTS 
  (SELECT 
    1 
  FROM
    test 
  WHERE NAME = a.name 
    AND val > a.val);
解析:
整个这句话的作用是查询出字段val > a.val不存在于表test而只存在与表a(test)的所有记录
--方法3: 
SELECT 
  a.* 
FROM
  test a,
  (SELECT 
    NAME,
    MAX(val) val 
  FROM
    test 
  GROUP BY NAME) b 
WHERE a.name = b.name 
  AND a.val = b.val 
ORDER BY a.name ;
--方法4: 
SELECT 
  a.* 
FROM
  test a 
  INNER JOIN 
    (SELECT 
      NAME,
      MAX(val) val 
    FROM
      test 
    GROUP BY NAME) b 
    ON a.name = b.name 
    AND a.val = b.val 
ORDER BY a.name ;
--方法5 
SELECT 
  a.* 
FROM
  test a 
WHERE 1 > 
  (SELECT 
    COUNT(*) 
  FROM
    test 
  WHERE NAME = a.name 
    AND val > a.val) 
ORDER BY a.name;
类似查询:
select * from B where (select count(1) as num from A where A.ID = B.ID) = 0;
就是统计B表和A表用ID连接的行数
子查询的行数=0,就可以实现从B表中排除A表数据。
select * from B where (select count(1) as num from A where A.ID = B.ID) = 0;
分析
假设个例子吧:A表
id 姓名 性别
00 aa 女
01 bb 女
02 cc 女
B表
id 姓名 性别
00 aa 女
02 cc 女
03 dd 男
select * from B是执行B表,
当执行id=‘00’时 ,因为select count(1) as num from A where A.ID = B.ID 不等于0 所以运行结果没有第一行id=‘00’,
当执行id=‘02’时,因为select count(1) as num from A where A.ID = B.ID 不等于0 所以运行结果没有第二行id=‘02’,
当执行id= ‘03’时,因为select count(1) as num from A where A.ID = B.ID 的结果等于0 ,符合条件,所以运行结果会有第三行。
运行结果为:
id 姓名 性别
03 dd 男
所以:可以在B表中 排除A表的数据。

/* 
"name"	"val"	"memo"
"a"	"3"	"a3--a的第三个值"
"b"	"5"	"b2--b的第五个值"

*/

仅供参考

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • angular $resource模块

    讲到使用$http同服务器进行通信,但是功能上比较简单,AngularJS还提供了另外一个可选的服务$resource,使用它可以非常方便的同支持restful...

    用户5640963
  • 【MongoDB进阶】MongoDB高可用集群配置的几种方案

    由于网络存储的快速发展,网络冗余技术被不断提升,提高IT系统的高可用性的关键应用就是网络高可用性,网络高可用性与网络高可靠性是有区别的,网络高可用性是通过匹配冗...

    用户5640963
  • MYSQL一个优化的过程

    背景:优化一个20数据的表查询 ###优化前 EXPLAIN SELECT DISTINCT ect.contract_no AS contrac...

    用户5640963
  • CodeCombat地牢关卡Python代码

    Zoctopus
  • 精准测试新玩法の基于犯罪心理学挖掘代码风险

    前言 犯罪心理学还能用于挖掘代码风险? 挖掘出来的东西是什么? 挖掘出来的东东长什么样子? 挖掘出来能用来做什么? 具体怎么样挖掘呢? 这是本文的主要探讨的内容...

    腾讯移动品质中心TMQ
  • 安永针对两项区块链产品发布最新版本

    全球四大国际会计师事务所之一的安永会计师事务所(Ernst&Young,EY)近日发布消息表示,已正式推出两项区块链开发项目的最新版本:第二代EY区块链分析器和...

    南坡海瑞
  • 利用Python sklearn的SVM对AT&T人脸数据进行人脸识别

    要求:使用10-fold交叉验证方法实现SVM的对人脸库识别,列出不同核函数参数对识别结果的影响,要求画对比曲线。 使用Python完成,主要参考文献【4】...

    ascii0x03
  • SQL返回当前天是星期几

    跟着阿笨一起玩NET
  • 直接Mark!开源的DevOps开发工具箱

    DevOps是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障(QA)部门之间的沟通、协作与整合。在DevOps的整个流程中,...

    小小科
  • iOS - DeviceToken 解析

    在stackoverflow中有人说过这样的解析方式并不好,但是一直没有问题,所以大家也就习惯了这样的解析方式了,但是iOS13中这样的解析方式就有问题了 大...

    韦弦zhy

扫码关注云+社区

领取腾讯云代金券