MySQL 查询GROUP BY处理后 另外的数据捆绑的问题

练习的时候遇到一个问题

如果数据按下表的格式:

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 后的目标只能是一个字段

猜你喜欢

转载自blog.csdn.net/SeasonSoy/article/details/81360706