练习的时候遇到一个问题
如果数据按下表的格式:
id | valueA | valueB | valueC |
---|---|---|---|
1 | 1 | 1 | a |
2 | 1 | 2 | b |
3 | 1 | 3 | c |
4 | 2 | 1 | d |
5 | 2 | 2 | e |
6 | 2 | 3 | f |
7 | 3 | 1 | g |
8 | 3 | 2 | c |
9 | 3 | 3 | c |
… | … | … | … |
目标是要查询,当valueA分别等于 1,2,3,…时,而且当valueB取最大时,此时valueC或ID的值
如果把valueA 当做一组,也就是需要被GROUP BY 的字段,表示B C的值都属于A,这里举例对valueB取最值,这是内置函数;如果要使用一些不属于内置函数的复杂查询,则是另外一种情况
一开始想走一些捷径,但后来明白了
GROUP BY 后,其他的字段只能分开计算!
例如我查找 Max(valueC)后,同时查询valueC是没有作用的,只会查到例如 (1 ,1,3,a)这样的数据,因为只对字段valueB进行了计算
思路
SELECT valueA,MAX(valueB) FROM tbl
GROUP BY valueA;
可以把最大值查出来,再用最大值来找valueC就可以了
SELECT P.id,P.valueA,P.valueC FROM
tbl
LEFT JOIN
( SELECT valueA,MAX(valueB) as big FROM tbl
GROUP BY valueA
)as P
ON tbl.valueA = P.valueA
WHERE tbl.valueB = P.big;
就可以了
** 这里的valueC 值等于其他表的键,通过查询两次同一个table的办法,处理GROUP BY A后,B和C的绑定
下面介绍一种需要查找如果不存在于 COUNT,MAX,MIN的方法。
例如现在的需求变成了:当valueA分别等于 1,2,3,…时,而且当valueB取第二大时,此时valueC或ID的值
首先第二大的值需要排序和LIMIT语句实现
SELECT valueB FROM tbl
-- 这里是考不考虑重复项的处理
-- GROUP BY valueB
ORDER BY valueB DESC
LIMIT 1,1
然后在外层加上,此时需要从外层查询上表,而且得加上valueA的约束
代码如下
SELECT N.valueA,
( SELECT id FROM tbl
WHERE valueA = A.valueA
-- 这里是考不考虑重复项的处理
-- GROUP BY valueB
ORDER BY valueB DESC
LIMIT 1,1
) as id,
( SELECT valueC FROM tbl
WHERE valueA = A.valueA
-- 这里是考不考虑重复项的处理
-- GROUP BY valueB
ORDER BY valueB DESC
LIMIT 1,1
) as C,
( SELECT valueB FROM tbl
WHERE valueA = A.valueA
-- 这里是考不考虑重复项的处理
-- GROUP BY valueB
ORDER BY valueB DESC
LIMIT 1,1
) as B,
FROM
-- 获取A的值,不过应用中,这里的A值很可能从其他表来
( SELECT valueA FROM tbl
GROUP BY valueA
) as A;
此时就完成了目标查询,需要重复写的原因是SELECT 后的目标只能是一个字段