前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【MYSQL分组查询前1或者前几名排名】

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

作者头像
用户5640963
发布2019-07-25 14:50:09
2.2K0
发布2019-07-25 14:50:09
举报
文章被收录于专栏:卯金刀GG

测试库表:

代码语言:javascript
复制
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

查询:

代码语言:javascript
复制
--方法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的第五个值"

*/

仅供参考

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
腾讯云服务器利旧
云服务器(Cloud Virtual Machine,CVM)提供安全可靠的弹性计算服务。 您可以实时扩展或缩减计算资源,适应变化的业务需求,并只需按实际使用的资源计费。使用 CVM 可以极大降低您的软硬件采购成本,简化 IT 运维工作。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档