1.如何在同一个查询中统计同一个列的不同值的数量,以减少查询的语句量。
例如,假设可能需要通过一个查询返回不同层级的列表菜单数量,可以通过以下语句进行查询:
select SUM(IF(functionlevel='0',1,0)) as 第一级,SUM(IF(functionlevel='1',1,0)) as 第二级,
SUM(IF(functionlevel='2',1,0)) as 第三级, SUM(IF(functionlevel='3',1,0)) as 第四级, SUM(IF(functionlevel='4',1,0)) as 第五级
, SUM(IF(functionlevel='5',1,0)) as 第六级 from t_s_function
或者:
select SUM(functionlevel='0') as 第一级,SUM(functionlevel='1') as 第二级,
SUM(functionlevel='2') as 第三级, SUM(functionlevel='3') as 第四级, SUM(functionlevel='4') as 第五级
, SUM(functionlevel='5') as 第六级 from t_s_function
还可以采用以下语句查询:
select COUNT(functionlevel='0' or null) as 第一级,COUNT(functionlevel='1' or null) as 第二级,
COUNT(functionlevel='2' or null) as 第三级, COUNT(functionlevel='3' or null) as 第四级, COUNT(functionlevel='4' or null) as 第五级
, COUNT(functionlevel='5' or null) as 第六级 from t_s_function
变形:
select count(*),functionlevel from t_s_function GROUP BY functionlevel
2.如何在一张表中根据某个字段进行分组,并取该字段同值时的最新或最久的数据。
例如:有如下数据:
现要根据code字段进行分组,即只获取code值相同的一条记录,且该记录的in_repertory_date字段要在同code值的记录中是最小的。希望的数据如下所示:
那么该sql如下所示即可实现该功能:
select * from materiel_bank_account, (select * from (select min(in_repertory_date)as min_time from materiel_bank_account GROUP BY code) temp GROUP BY min_time) a where in_repertory_date = a.min_time order by in_repertory_date desc