两种业务场景处理
- 不必完全展示所有的分组(只展示本表存在的所有分组)
<?php
/**
* 基本逻辑
* 1 .先按照正常查找的数据进行分组
* 2 .查询所有的数据记录
* 3. 将所有的数据记录 左连接 正常查找的分组数据
* 4. 去掉重复数据
* */
$sql = <<<SQL
SELECT DISTINCT d.device_state, IFNULL( tb.count, 0) number
FROM flow_device d
LEFT JOIN (
SELECT device_state , count(*) count
FROM flow_device
WHERE product_id = $v->id
GROUP BY device_state
)
AS tb
ON d.device_state = tb.device_state
SQL;
$analyse = DB::select($sql);
- 完全展示所有分组 (无论本表中是否存在分组,都将所有分组完全展示)
与第一种逻辑唯一区别在于,需要另外建一张所有分组都存在的表。
/**
* 1. 查询符合要求的分组
* 2. 建造一张所有分组都存在的表
* 3. 将所有分组都存在的表 左连接 符合分组的表
*/
$sql = <<<SQL
SELECT ds.device_state, IFNULL( d.count, 0) number,
CASE ds.device_state
WHEN 0 THEN
"未激活"
WHEN 1 THEN
"离线"
WHEN 2 THEN
"在线"
ELSE
"非法状态"
END str_status
FROM flow_device_status ds
LEFT JOIN (
SELECT device_state , count(*) count
FROM flow_device
WHERE product_id = $v->id
GROUP BY device_state
)
AS d
ON ds.device_state = d.device_state
SQL;
总结:将查询的结果,在通过左查询进行补充(或者过滤)。