环境:mysql数据库链接
需求:想统计数据库中的设备号,设备状态,以及设备中子设备的状态 。
分别为俩个表:
1.设备表:设备号(userId),状态 (State)
2.自设备表:设备号(userId),子设备类型(E_type), 子设备状态 (Evalue)
解决方案:
1>使用Sql语句解决
SELECTtabledevice.设备编号,
tabledevice.`终端状态 `,
GROUP_CONCAT(tabledevice.硬件状态)AS '硬件状态集合'
FROM (SELECTe.UserIdAS '设备编号',
e.StateAS '终端状态',
CONCAT(eState.E_type, ":", eState.E_value)AS '硬件状态'
FROMequipment eLEFT JOINequipmentstate eStateON e.UserId =eState.UserId
)AStabledeviceGROUP BY tabledevice.设备编号;
使用Join left 根据 userId链接俩个表,并将字段CONCAT(eState.E_type, ":", eState.E_value) 将硬件类型和状态拼接起来 得到的表数据 重命名为 表tabledevice
然后将表分组 ,分别统计为 UserId State 和状态集合、
注意 GROUP_CONCAT() 是将当前整个分组集合中的某一列,拼成一行数据。如果未分组,则默认整个表某一列全部拼在一起
2>使用SqlSugar解决
还是自己看文档不够认真找了几遍,没找到原生函数。
原本以为:会像数据类型转换一样,使用 SqlFunc 去转换数据。结果没有。哈哈
实际是SqlSugar 可以简介使用sql函数的。
例如:
List list9 = db.Queryable().Where(c => c.id < 20).GroupBy(it => it.sex).Select("Sex,count(*) Count").ToList();
恍然大悟, 一下子清楚了。使用sqlsugar解决上面的数据需求
var res = db.Queryable((s1, s2) => new object[]{
JoinType.Left ,s1.UserId==s2.UserId
}
).Select("s1.UserId,State, CONCAT(s2.E_type, \":\", s2.E_value) ashardState");var data = db.Queryable(res).Select("UserId,State,GROUP_CONCAT(hardState) ashardList "
).GroupBy(s1=> s1.UserId).ToList();
数据过滤方式和使用sql语句基本一致。
原始视图:
结果如图示: