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

在MySQL中遇到GROUP BY操作后,其他字段不能直接捆绑查询的问题。GROUP BY后,若要获取valueB的最大值并同时得到对应的valueC,必须分开计算。例如,查询valueA各组内valueB最大时的valueC,需要先找出最大valueB,再通过这个最大值去查询valueC。对于更复杂的需求,如找到valueB的第二大值,可以结合排序和LIMIT实现,并在外层查询中加入valueA的条件来完成目标查询。

练习的时候遇到一个问题

如果数据按下表的格式:

idvalueAvalueBvalueC
111a
212b
313c
421d
522e
623f
731g
832c
933c

目标是要查询,当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 后的目标只能是一个字段

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值