1. 这是表中的原数据(表名称 city_tag)
a) 查询出上面 oc, sc , pc , hc, gc, ghc 6个指标中有任意四个大于或等于50的城市名称,这个是不是不能使用普通的 or 语法了,
因为是任意的, 查询语句如下 (这里可以用 if 语句)
select city_temp.`name`,SUM(t1+ t2 + t3 + t4 + t5 +t6) as sum_data from ( select name, if (oc >= 50, 1, 0) as t1, if (sc >= 50, 1, 0) as t2, if (pc >= 50, 1, 0) as t3, if (hc >= 50, 1, 0) as t4, if (gc >= 50, 1, 0) as t5, if (ghc >= 50, 1, 0) as t6 from city_tag ) city_temp
GROUP BY city_temp.`name` HAVING sum_data >= 4;
b) 查询平均指标大于 50 的城市名称(这里强调下city_tag 的主键为name)所以这里的sql会和你看到的一些博客上面的成绩查询
有点不样,有的成绩查询科目的名称放在一个字段里面,同一个学生会有多条记录,那样就可以根据学生编号分组再 avg() 成绩就可以了,上面的表结构是每个指标都是一个单独的字段所以sql如下
SELECT t.`name`, ( SUM( t.oc + t.sc + t.pc + t.hc + t.gc + t.ghc ) / 6 ) AS souce FROM city_tag t GROUP BY t.`name` HAVING souce > 50;
或 使用
SELECT t.`name` FROM city_tag t GROUP BY t.`name` HAVING ( SUM( t.oc + t.sc + t.pc + t.hc + t.gc + t.ghc ) / 6 ) > 50
2. 表结构如下
a) 查询type相同的 value 最大城市的名称, 分析需要根据type 进行分组在分组里面用max()函数 获得最大的value 数据,再和原表city 进行 inner join
sql 如下
SELECT h_city.`name`, h_city.type, h_city.`value` FROM city h_city INNER JOIN ( SELECT city.type AS type, MAX(city.`value`) AS max_value FROM city GROUP BY city.type ) t_city ON h_city.type = t_city.type AND h_city.`value` = t_city.max_value;
b) 需求再次升级 需要查询city 同一个类型(type ) value最大的前面两个城市(即需要查询出每个type下面前面最高的两个value)
sql如下 (需要 把 city t 和 city 当做两个表来理解)
SELECT t.`name`, t.type, t.`value` FROM city t WHERE ( SELECT count(1) FROM city WHERE type = t.type AND `value` > t.`value` ) <= 1;