在一次项目中需要跨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万条记录。
解决方案- 由于是筛选条件是无法确认优先顺序的,在WHERE筛选的时候。那么首先解决的就是要先确保业务流程的中优先筛选条件;
- 根据优先筛选的条件产生的结果集,由结果集内的uniacid再对member、leader两个数据表进行二次循环,实现高效、快捷的查询;
- 对上述的结果集,进行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!