MySQL实战基础知识入门(9):MYSQL跨4个表的高效查询代码的解决方案

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
云数据库 RDS MySQL Serverless,价值2615元额度,1个月
简介: MySQL实战基础知识入门(9):MYSQL跨4个表的高效查询代码的解决方案

在一次项目中需要跨4个表查询相关数据,形成一个json供前端调用。


失败的解决方案

    global $db, $res;
        dbc();
        $sql = "select a.uniacid,SUM(a.should_paid) AS totalPays,COUNT(a.id) AS transTotal,MAX(a.paid_at) AS paid_at,b.uniacid,b.name,c.uniacid,COUNT(c.id) AS memberTotal,c.created_at from " . $db->table('orders');
        $sql .= " AS a, " . $db->table('set_basic') . " AS b," . $db->table('member') . "AS c";// . $db->table('leader') . "AS d";
        $sql .= " WHERE a.paid_at <> 0 AND date_format(a.paid_at,'%Y-%m-%d') = CURDATE() AND a.uniacid = b.uniacid";
        $sql .= " AND date_format(c.created_at,'%Y-%m-%d') = CURDATE() AND a.uniacid = c.uniacid";
        $sql .= " GROUP BY a.uniacid ORDER BY totalPays DESC LIMIT 15";
        $row = $db->queryall($sql);
        $res["data"] = $row;
        die(json_encode_lockdata($res));

**产生的问题:**页面直接奔溃,下载进度转了几圈就直接显示网页无法显示了。

**产生的原因:**四个数据表都要根据uniacid进行唯一的键值关系查找匹配,但是每个表同时还要关联很多WHERE条件,在实际开发过程中,自己都不知道如何排列哪个作为优先的筛选条件。数据表中的member、leader都超过20万条记录。


解决方案

  1. 1.由于是筛选条件是无法确认优先顺序的,在WHERE筛选的时候。那么首先解决的就是要先确保业务流程的中优先筛选条件;
  2. 2.根据优先筛选的条件产生的结果集,由结果集内的uniacid再对member、leader两个数据表进行二次循环,实现高效、快捷的查询;
  1. 3.对上述的结果集,进行JSON编码,提供前端使用;
        //筛选全部记录并随前端自动分页展示;
        $sql = "select SUM(a.should_paid) AS totalPays,a.paid_at,a.uniacid,b.uniacid,b.name from " . $db->table('orders');
        $sql .= " as a, " . $db->table('set_basic') . " as b where a.uniacid = b.uniacid AND a.paid_at <> '' ";
        $sql .= " GROUP BY b.name ORDER BY totalPays DESC";
        $sql .= " LIMIT " . $limit . "," . $pagesize;
        $row = $db->queryall($sql);
        //获取对应的站点会员数量;
        foreach ($row as $k => $v) {
            $sql_m = "select COUNT(id) AS memberTotal from " . $db->table('member');
            $sql_m .= " WHERE legitimate = 1 AND uniacid =" . $v['uniacid'];
            $sql_m .= " GROUP BY uniacid";
            $row[$k]["member"] = $db->queryall($sql_m);
        }
        //获取对应站点团长的数量;
        foreach ($row as $k => $v) {
            $sql_l = "select IFNULL(COUNT(id),0) AS leaderTotal from " . $db->table('leader');
            $sql_l .= " WHERE server = 1 AND legitimate = 1  AND uniacid =" . $v['uniacid'];
            $sql_l .= " GROUP BY uniacid";
            $row[$k]["leader"] = $db->queryall($sql_l);
        }
        $res["data"] = $row;
        die(json_encode_lockdata($res));


Done!

相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5天前
|
关系型数据库 MySQL
Mysql语句_查询数据百分比、人员年龄、数据排序、添加查询时的列属性、合并查询结果
Mysql语句_查询数据百分比、人员年龄、数据排序、添加查询时的列属性、合并查询结果
9 0
|
1天前
|
SQL 关系型数据库 MySQL
【MySQL】:分组查询、排序查询、分页查询、以及执行顺序
【MySQL】:分组查询、排序查询、分页查询、以及执行顺序
13 0
|
2天前
|
SQL 分布式计算 关系型数据库
云原生数据仓库产品使用合集之可以把ADB MySQL湖仓版数据库做成页面查询的数据库吗
阿里云AnalyticDB提供了全面的数据导入、查询分析、数据管理、运维监控等功能,并通过扩展功能支持与AI平台集成、跨地域复制与联邦查询等高级应用场景,为企业构建实时、高效、可扩展的数据仓库解决方案。以下是对AnalyticDB产品使用合集的概述,包括数据导入、查询分析、数据管理、运维监控、扩展功能等方面。
|
2天前
|
存储 关系型数据库 MySQL
MySQL数据库实战:从入门到精通
本文介绍了MySQL的使用和优化,适合Web开发者阅读。首先,确保安装并配置好MySQL,熟悉SQL基础。接着,通过命令行客户端连接数据库,执行创建、查询、添加、修改和删除数据等操作。学习数据类型并创建表存储数据。最后,探讨了数据库优化,包括查询优化和索引使用,以提升性能。
10 2
|
4天前
|
SQL 关系型数据库 MySQL
【MySQL】脏读、不可重复读、幻读介绍及代码解释
【MySQL】脏读、不可重复读、幻读介绍及代码解释
|
4天前
|
关系型数据库 MySQL 数据挖掘
【MySQL】多表连接查询
【MySQL】多表连接查询
|
4天前
|
存储 关系型数据库 MySQL
{MySQL} 数据库约束& 表的关系& 新增&&删除& 修改& 查询
{MySQL} 数据库约束& 表的关系& 新增&&删除& 修改& 查询
13 0
|
4天前
|
安全 关系型数据库 MySQL
node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)
node实战——后端koa结合jwt连接mysql实现权限登录(node后端就业储备知识)
14 3
|
5天前
|
SQL 关系型数据库 MySQL
不允许你不知道的 MySQL 优化实战(一)
不允许你不知道的 MySQL 优化实战(一)
12 2
|
8天前
|
关系型数据库 MySQL 中间件
【MySQL实战笔记】07 | 行锁功过:怎么减少行锁对性能的影响?-02 死锁和死锁检测
【4月更文挑战第19天】在高并发环境下,死锁发生在多个线程间循环等待资源时,导致无限期等待。MySQL中,死锁可通过`innodb_lock_wait_timeout`参数设置超时或`innodb_deadlock_detect`开启死锁检测来解决。默认的50s超时可能不适用于在线服务,而频繁检测会消耗大量CPU。应对热点行更新引发的性能问题,可以暂时关闭死锁检测(风险是产生大量超时),控制并发度,或通过分散记录减少锁冲突,例如将数据分拆到多行以降低死锁概率。
22 1