首页 > 其他分享 >子查询用order by,外层用group by但是order by没生效

子查询用order by,外层用group by但是order by没生效

时间:2023-08-25 18:23:00浏览次数:52  
标签:外层 group name WHEN limit plan order NAME

今天遇见一个需求:从entity表查询name在我传过来的一个name集合里面,但是同一个name可能会重复,所以我需要根据plan字段判断取每个name的第一条,如果plan=我传进来的plan,优先,plan不等于我传进来的参数的情况下,如果plan不为空,优先,最后就是plan为空的数据。返回的数据就是每个name的第一条的集合

后面的解决方法是SELECT
*
FROM
(
SELECT
*
FROM
entity
ORDER BY
CASE

WHEN plan = '1' THEN
0 
WHEN plan != '1' 
AND plan IS NOT NULL THEN
1 ELSE 2 

END limit 10
) a
WHERE
NAME in ('zhang','li')
GROUP BY
NAME
但是很奇怪,里面我不加limit,他查出来的数据并不是order by排序后的分组靠前数据,也就是order by没生效。查阅得知:
mysql 5.7版本查询进行优化了,认为子查询中的order by可以进行忽略,只要Derived table里不包含如下条件就可以进行优化:

UNION clause
GROUP BY
DISTINCT
Aggregation
LIMIT or OFFSET
简单来说不想被优化就需要在子查询里添加上面的条件(仅仅是用作不被优化)

所以子查询在用order by,外层用group by的时候,需要加上以上条件,最简单当然也就是limit了

后面觉得这样还是要用limit,觉得不好,limit的值要保证比我数据大,不然也会有问题,后面转换思路,这样解决了
SELECT
e.*
FROM
entity e
WHERE
( CASE WHEN plan = '1' THEN 0 WHEN plan != '1' AND plan IS NOT NULL THEN 1 ELSE 2 END ) = (
SELECT
min( CASE WHEN plan = '1' THEN 0 WHEN plan != '1' AND plan IS NOT NULL THEN 1 ELSE 2 END )
FROM
entity hh
WHERE
hh.NAME = e.NAME
AND e.NAME IN ( 'zhang', 'li' )
)

标签:外层,group,name,WHEN,limit,plan,order,NAME
From: https://www.cnblogs.com/zzqcupidzhq/p/17657684.html

相关文章

  • GROUP BY的理解
    sql GROUPBY怎么理解呢就是数据分类,select后面跟上要分类的物品假如有一个仓库表---------------------------------------水果|颜色苹果| 绿苹果| 红梨子|黄--------------------------------------------------------------比如select水果from仓库 GRO......
  • 【算法】在vue3的ts代码中分组group聚合源数据列表
    有一个IList<any>()对象列表,示例数据为[{id:'1',fieldName:'field1',value:'1'},{id:'1',fieldName:'field2',value:'2'},{id:'2',fieldName:'field1',value:'1'},{id:'2',......
  • unordered_set 的初始化方法
    unordered_set是一个哈希表的实现,因此初始化其实就是给它分配一定的空间,并且指定哈希表中每个元素的存储方式。unordered_set的初始化方式有以下几种:无参构造函数std::unordered_set<int>mySet;默认情况下,unordered_set会分配一定的内存,并且使用默认的哈希函数和比较函......
  • jmeter详解-线程组详解(9)-bzm - Free-Form Arrivals Thread Group
    bzm-Free-FormArrivalsThreadGroup介绍: 顾名思义,相当于自由形式的ArrivalsThreadGroup,它只是提供了自由形式的时间表的能力。相当于我们可以更灵活的控制 每分钟/每秒钟的请求数。页面说明:ThreadsSchedule(线程场景):Startvalue:开始时的用户数Endvalue:结束时......
  • jmeter详解-线程组详解(8)-bzm - Arrivals Thread Group
    bzm-ArrivalsThreadGroupArrival:到来,抵达介绍这个线程组使用“arrivals”调度作为一种表达负载的方式。“arrivals”表示线程迭代开始。如果所有现有线程在迭代过程中都很忙,它将创建新线程。注意,恒定的到达率意味着增加并发性,所以要小心你输入的值。使用“ConcurrencyLimi......
  • 服务器数据恢复-HP EVA存储VDISK被删,磁盘被UNGROUP的数据恢复案例
    服务器数据恢复环境:某单位有一台HPEVA存储,连接2组扩展柜,扩展柜中有12块FATA磁盘和10块FC磁盘,不确定数量的LUN,主机安装WINDOWSSERVER操作系统,存储设备用来存放该单位的重要资料。服务器故障初检:存储不可用。因故障存储在多家数据恢复服务商处理过,所以在暂时无法直接定位故障原......
  • jmeter详解-线程组详解(6)-jp@gc - Stepping Thread Group
    jp@gc-SteppingThreadGroup线程组模拟测试场景:从某个值开始不断增加压力,直至达到某个值,然后持续运行一段时间。添加方式:页面说明:thisgroupwillstart:表示总共要启动的线程数;若设置为100,表示总共会加载到100个线程first,waitfor:从运行之后多长时间开始启动线程;若......
  • jmeter详解-线程组详解(5)-jp@gc - Ultimate Thread Group
    添加方式:右键测试计划->添加->Threads(Users)->jp@gc-UltimateThreadGroup页面说明:StartThreadsCount:当前行的线程总数InitialDelay/sec:延时启动当前行的线程,单位:秒StartupTime/sec:启动当前行所有线程达峰值所需时间,单位:秒HoldLoadFor/sec:当前行线程达到峰值......
  • jmeter详解-线程组详解(4)-tearDown Thread Group
    tearDownThreadGroup线程组:在测试任务线程组运行结束后被运行。通常用来做清理测试脏数据、登出、关闭资源等工作。应用场景举例:A、测试数据库操作功能时,用于执行关闭数据库连接的操作。B、测试用户购物功能时,用于执行用户的退出等操作。tearDownThreadGroup线程的行为与......
  • P9556 [SDCPC2023] A-Orders 题解
    题目传送门一道模拟题。可以命名一个订单的结构体,然后将订单的结束时间进行排序。用一个变量模拟货物的数量,每遇到一个订单,货物的数量就会加上距离上一个订单的天数乘上\(k\)。即对于第\(i\)个订单,距离第\(i-1\)订单货物数量增加了\((a_{i}-a_{i-1})\timesk\)。如果在模......