mysql中子查询有多个结果返回怎么处理

问题

在查询的时候,有时候经常需要用到子查询,比如查询今天的订单数量, 7天的订单数量,31天的订单数量, 这种条件不一样,但是非要整在一个表中来显示就需要很多子查询来实现了:

select(select xx from xx where 条件一) as 结果一,
select(select xx from xx where 条件二) as 结果二,
select(select xx from xx where 条件三) as 结果三

但是有时候, 几个结果的条件是一样的, 但是子查询只能返回一个结果, 也就是我们需要分成多个子查询来查询相同的条件

select(select xx from xx where 条件一) as 结果一,
select(select xx from xx where 条件一) as 结果二,
select(select xx from xx where 条件一) as 结果三,
select(select xx from xx where 条件二) as 结果四

处理

在网上搜罗一圈后, 有一个解决办法挺新颖的, 大概就是先把同样条件的多个结果, 先拼接成一个, 再在外面进行拆分, 在java里面比如是"aa,bb,cc".split(",")

select 
SUBSTRING_INDEX(temp.结果一,',',1) as 第一列数据,
SUBSTRING_INDEX(SUBSTRING_INDEX(temp.结果一,','2),',',-1) as 第二列数据,
SUBSTRING_INDEX(temp.结果一,','-1) as 第三列数据,
temp.结果二 as 第四列数据
FROM(
    select(select concat_ws(',',数据一, 数据二,数据三)  from xx where 条件一) as 结果一,
    select(select xx from xx where 条件二) as 结果二
)temp

[补充]关于substring_index的用法

SUBSTRING_INDEX('待切割的字符串', '截取分割的字符,比如逗号' , 长度)

  • 长度为负数,从右边开始, 比如"a,b,c,d", 长度为-1取得是"d"
  • a: SUBSTRING_INDEX("a,b,c,d" , "," , 1)
  • b: SUBSTRING_INDEX(SUBSTRING_INDEX("a,b,c,d" , "," , 2) ,",",-1) 先拿到前2位,再取最后一位
  • d: SUBSTRING_INDEX("a,b,c,d" , "," , -1)
  • cd: SUBSTRING_INDEX("a,b,c,d" , "," , -2)

demo:

SELECT
    SUBSTRING_INDEX(temp.today, ",", 1) AS `今日加购量`,
    SUBSTRING_INDEX(temp.today, "," ,- 1) AS `今日加购商家数`
FROM
    (
        SELECT
            CONCAT_WS(
                ',',
                COUNT(*),
                COUNT(DISTINCT c.MALL_STORE_ID)
            ) AS today
        FROM
            mall_goods_cart c
        WHERE
            STR_TO_DATE(c.CREATE_TIME, '%Y-%m-%d') = CURDATE()
    ) AS temp

猜你喜欢

转载自blog.csdn.net/zzzgd_666/article/details/81101548