MySQL多层查询

本文通过一个具体的SQL查询案例,展示了如何从订单数据中筛选并汇总特定用户的订单状态信息。该查询涉及复杂的子查询和多表关联,对于理解SQL聚合函数、条件筛选及结果排序具有很好的参考价值。

 select user_id,status from mmall_order;
+--------+--------+
| user_id | status |
+--------+--------+
|      1 |     10 |
|      1 |     10 |
|      1 |     40 |
|      1 |     20 |
|      1 |     20 |
|      1 |     10 |
|      1 |     10 |
|      1 |     10 |
|      1 |     10 |
|      1 |     10 |
|      1 |     10 |
|      1 |     10 |
|      1 |     10 |
|      1 |     40 |
|      1 |     40 |
|     29 |     40 |
|     29 |     40 |
|     30 |     10 |
|     30 |     10 |
|     29 |     10 |
|     29 |     10 |
|     29 |     10 |
|     30 |     10 |
|     29 |     10 |
|     29 |     10 |
|     29 |     10 |
|     31 |     10 |
|     31 |     10 |
|     31 |     10 |
|     31 |     20 |
|     35 |     10 |
|     35 |     10 |
|     35 |     20 |
|     31 |     40 |
|     37 |     20 |
|     31 |     10 |
|     31 |     10 |
|     31 |     20 |
|     39 |     10 |
|     40 |     10 |
|     40 |     10 |
|     40 |     10 |
|     31 |     20 |
|     29 |     10 |
|     26 |     10 |
|     41 |     10 |
|     29 |     10 |
|     42 |     10 |
|     42 |     10 |
|     42 |     10 |
|     29 |     10 |
|     44 |     10 |
|     45 |     20 |
|     44 |     20 |
|     44 |     20 |
|     31 |     20 |
+--------+--------+
56 rows in set

select * from 

(select user_id,sum(status) as sus,count(user_id) as cons2 from mmall_order group by user_id)temps where   temps.sus>0 and user_id in 
 (select user_id from 
  (select user_id,count(user_id) as sus2 from mmall_order group by user_id) temps2 

    where temps2.sus2>0) order by sus desc,cons2 desc limit 2,3;

+--------+-----+-------+
| user_id | sus | cons2 |
+--------+-----+-------+
|     31 | 170 |    10 |
|     44 | 50  |     3 |
|     35 | 40  |     3 |
+--------+-----+-------+

### 如何在 MySQL 中执行多层 JSON 查询 #### 创建带有 JSON 列的数据 为了展示如何进行多层 JSON 查询,先创建一个包含 JSON 类型列 `data` 的格 `json_data`[^1]。 ```sql CREATE TABLE json_data ( id INT AUTO_INCREMENT PRIMARY KEY, data JSON NOT NULL ); ``` #### 插入多层结构的 JSON 数据 向上述创建好的 `json_data` 格中插入一些具有嵌套层次结构的 JSON 文档作为测试数据: ```sql INSERT INTO json_data (data) VALUES ('{ "employee": { "name": "张三", "department": "研发部", "address": { "city": "北京", "street": "中关村大街" }, "projects": [ {"project_name": "项目A", "start_date": "2023-01-01"}, {"project_name": "项目B", "start_date": "2023-06-01"} ] } }'); ``` #### 执行单层路径查询 对于简单的键值对查询,可以直接利用箭头操作符 (`->`) 来访问指定路径下的值。例如要获取员工的名字可以这样做: ```sql SELECT data -> '$.employee.name' AS employee_name FROM json_data; ``` 这将会返回如下结果: | employee_name | |---------------| | "张三" | 注意这里的字符串会被加上双引号示这是一个 JSON 字符串类型的结果;如果想要去掉这些额外的引号,则可使用 `->>` 运算符代替 `->`. #### 多层路径查询 当涉及到更深层次的对象属性时,只需继续扩展路径即可。比如要获得城市名称: ```sql SELECT data ->> '$.employee.address.city' as city FROM json_data; ``` 此命令将输出: | city | |----------| | 北京 | #### 数组中的对象查询 假设现在希望找到参与特定项目的员工姓名,即遍历数组并匹配某个条件。此时需要用到函数 `JSON_CONTAINS_PATH()` 和/或其他辅助函数如 `JSON_UNQUOTE()`, `JSON_EXTRACT()` 等来处理复杂情况。下面是一个例子,它会找出所有参加了“项目A”的员工名字: ```sql SELECT JSON_UNQUOTE(data->>'$.employee.name') AS name FROM json_data WHERE JSON_CONTAINS(JSON_EXTRACT(data,'$.employee.projects[*].project_name'), '"项目A"', ''); ``` 这段SQL语句首先提取了所有的子项列,接着判断是否存在目标字符串,并最终取出了符合条件记录里的员工姓名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值