当前位置: 首页 > article >正文

在SQL的SELECT中实现循环查找、双层和多层循环(迭代)查找 SQL如何实现编程语言的for循环查询 MySQL的Select子查询

在SQL的SELECT中实现循环查找、双层和多层循环(迭代)查找 SQL如何实现编程语言的for循环查询 MySQL的Select子查询。

一、背景

在查询表极大,可能需要使用特定的查询索引的时候,使用SELECT子查询会比使用Inner Join查询效率要高。

如,我需要知道美国站点的在线listing数。普通的查询语句,直接使用Inner Join查询会由于店铺数量出现极大的查询性能问题。若店铺少,可能会几秒,随着店铺多起来,查询等待时间可能成百上千倍的增长,而不是预期的线性增长。甚至很多时候,会直接卡死。(原表上亿行)。

使用循环式查找则是将店铺表作为主表,然后嵌套SELECT子查询来实现。有点类似于每个店铺都是用编程语言的for循环,来逐条执行。这种方式快速且稳定。当表格极大,且需要用到特定的索引时,查询性能提升尤为明显。(注意,这里店铺表才几百个店铺,而listing有上亿)

二、一层迭代(一层循环)

①需求:查找以深圳开头、国家为美国的店铺在平台的美国站点的在线listing数。

②、Inner Join实现

/*
普通Inner Join。

时间:45.067
*/
select
    os.OrderSourceID
    , count(1) listing表在线listing数
from sys_ordersource os 
inner join m_ebay_listing el on el.OrderSourceId=os.OrderSourceID
where os.CustomerID=1
    and os.OrderSourceType=2
    and os.OrderSourceCountry = 'US'
    and os.OrderSourceName like '深圳%'
    and el.SiteCode='US'
    and el.OnlineStatus=1
group by os.OrderSourceId
;

③、嵌套查询实现、迭代查询的子查询

/*
SELECT 子查询

时间:6.570
*/
select
    os.OrderSourceID
    , (
        select 
           count(1) 
        from m_ebay_listing el
        where el.OrderSourceId=os.OrderSourceID
        and el.SiteCode='US'
        and el.OnlineStatus=1
    ) listing表在线listing数
from sys_ordersource os 
where os.CustomerID=1
    and os.OrderSourceType=2
    and os.OrderSourceCountry = 'US'
    and os.OrderSourceName like '深圳%'
;

三、两层迭代(两层循环)

①需求:在2025年1月15号到2025年1月20号,等级为3、国家为美国的深圳店铺的每天刊登成功的listing数

注:ap_autopublish_ebay_queue 队列表有几亿的数据。

②单层with的两层迭代查询

/*
方式一、美国站点的中级店铺,在1月15号到1月20号每日的刊登成功量。

时间:1.914s
居然比下面那个快这么多。
*/
WITH RECURSIVE temp_dateTable AS (
  SELECT 20250115 AS datekey
  UNION ALL
  SELECT date_format(date_add(CONVERT(datekey, CHAR),interval 1 day), "%Y%m%d")+0
  FROM temp_dateTable
  WHERE datekey < 20250120
)
select
        dt.datekey
        , os.OrderSourceID
        , (
            select
                count(1) 数量
            from ap_autopublish_ebay_queue peq
            where peq.CustomerId=1
                and peq.MarketId=2
                and peq.date=dt.datekey
                and peq.OrderSourceId = os.OrderSourceID
                and peq.Status='success'
        ) 刊登成功数
from temp_dateTable dt
inner join sys_ordersource os on 1=1
inner join sys_ebay_odersource_level eol on os.CustomerID=eol.CustomerID and os.OrderSourceID=eol.OrderSourceID
where os.CustomerID=1
        and os.OrderSourceType=2
        and os.OrderSourceName like '直发%'
        and os.OrderSourceCountry='US'
        and eol.StoreLevel=3

③两层with的两层迭代查询:可借鉴用来实现多层迭代查询

/*
方式二、美国站点的中级店铺,在1月15号到1月20号每日的刊登成功量。

时间:17.343s
*/
WITH RECURSIVE temp_dateTable AS (
  SELECT 20250115 AS datekey
  UNION ALL
  SELECT date_format(date_add(CONVERT(datekey, CHAR),interval 1 day), "%Y%m%d")+0
  FROM temp_dateTable
  WHERE datekey < 20250120
), tos as (
        select 
                os.OrderSourceID
        from sys_ordersource os
        inner join sys_ebay_odersource_level eol 
            on os.CustomerID=eol.CustomerID and os.OrderSourceID=eol.OrderSourceID
        where os.CustomerID=1
            and os.OrderSourceType=2
            and os.OrderSourceName like '直发%'
            and os.OrderSourceCountry='US'
            and eol.StoreLevel=3
)
select
        dt.datekey
        , tos.OrderSourceID
        , (
            select
                count(1) 数量
            from ap_autopublish_ebay_queue peq
            where peq.CustomerId=1
                and peq.MarketId=2
                and peq.date=dt.datekey
                and peq.OrderSourceId = tos.OrderSourceID
                and peq.Status='success'
        ) 刊登成功数
from temp_dateTable dt
inner join tos on 1=1

四、多层迭代(多层循环)

请参考三、两层迭代(两层循环)中的第三小节③两层with的两层迭代查询,通过新增多层with实现。
(实例:略)


http://www.kler.cn/a/514987.html

相关文章:

  • 如何实现网页不用刷新也能更新
  • 7.8 ChatGPT 开发者模式实战:第三方天气查询平台对接,如何打造爆款天气应用?
  • windows平台intel-vpl编译
  • Django 的 `Meta` 类和外键的使用
  • 为什么相关性不是因果关系?人工智能中的因果推理探秘
  • opencv在图片上添加中文汉字(c++以及python)
  • Spring Boot 自定义属性
  • 代码随想录算法训练营第 15 天(树3)| 110.平衡二叉树、257. 二叉树的所有路径、404.左叶子之和、222.完全二叉树的节点个数
  • #攻防演练#应急响应#对于挖矿的检测以及防御方案
  • PCF8563一款工业级、低功耗多功能时钟/日历芯片
  • ChatGPT大模型极简应用开发-CH3-使用 GPT-4 和 ChatGPT 构建应用程序
  • 大模型:LangChain技术讲解
  • Linux 离线安装php+nginx+ftp
  • ZooKeeper 中的 ZAB 一致性协议与 Zookeeper 设计目的、使用场景、相关概念(数据模型、myid、事务 ID、版本、监听器、ACL、角色)
  • 【Elasticsearch】index.mapping.source.mode
  • 语义分割文献阅读-SegNet:一种用于图像分割的深度卷积编码器-解码器架构(1.13-1.19)
  • 计算机毕业设计hadoop+spark股票基金推荐系统 股票基金预测系统 股票基金可视化系统 股票基金数据分析 股票基金大数据 股票基金爬虫
  • 蓝桥杯真题 - 翻转 - 题解
  • 如何用Python和Dash打造一个智能股票筛选与可视化系统
  • 关于六通道串口服务器详细讲解
  • 手写SOCKET进行HTTP通信
  • 【云网】云网络基础概念(华为云)
  • 大模型 | AI驱动的数据分析:利用自然语言实现数据查询到可视化呈现
  • 基于STM32的智能空气质量监测与净化系统设计
  • 如何将办公室固定电话设置呼叫转接(或呼叫转移)到手机 -远程高效办公
  • DeepSeek R1发布综述:开源大语言模型的推理能力新标杆