分组问题

时间:2009-07-17 16:04:44

标签: mysql group-by

使用Group时如何在使用聚合时保持其他字段同步

这里我试图在col2 = xxx

时找到col4的最小值
select col1, col2, col3, min(col4)
from table
where col2 = 'xxx'
group by col3

我可以在col4中获得最小值,但col1不正确,但是col2,col3,col4是。

有人能告诉我怎么做吗?

由于

3 个答案:

答案 0 :(得分:3)

您使用的是非标准MySQL extensionGROUP BY

此查询实际上显示为“对于col3的每个不同值,请选择col4的最小值以及col1col2的值table的行,其值为col3,没有特定的顺序“

如果我们有以下数据:

col1 col2 col3 col4
---- ---  ---  ----

A    A    1    1
B    B    1    2
C    C    2    3
D    D    2    4

,这个查询:

SELECT  col1, col2, col3, MIN(col4)
FROM    mytable
GROUP BY
        col3

将返回以下任一项:

col1 col2 col3 col4
---- ---  ---  ----
A    A    1    1
C    C    2    3

col1 col2 col3 col4
---- ---  ---  ----
B    B    1    1
C    C    2    3

col1 col2 col3 col4
---- ---  ---  ----
A    A    1    1
D    D    2    3

col1 col2 col3 col4
---- ---  ---  ----
B    B    1    1
D    D    2    3

我。即它可以返回在对相应组有贡献的行中找到的col1col2的任何值。

这相当于FIRST_VALUE分析函数,但没有特别的顺序。

<强>更新

要选择与每个组中col1的最小值对应的col2col4的值,请使用:

SELECT  col1, co2, col3, col4
FROM    (
        SELECT  col1, col2, col3, col4,
                COALESCE(@col3 = col3, FALSE) AS grp,
                @col3 := col3 AS nv
        FROM    (
                SELECT  @col3 := NULL
                ) vars, table
        WHERE   col2 = 'xxx'
        ORDER BY
                col3, col4
        ) q
WHERE   NOT grp

答案 1 :(得分:0)

 select a.col3, a.col2, a.col1, a.col4
 from table as a natural join 
       (select col3, min(col4) as col4 from table
        where col2='xxx'
        group by col3 ) as b
 where a.col2 = 'xxx' -- sometimes this helps the optimizer even though it's redundant

如果可能有多个行具有相同的col3,col4和col2,但是col1s不同,你可能会遇到一些麻烦 - 用rownums等修复它们非常简单,但这会得到特定于db的行。 / p>

答案 2 :(得分:0)

我猜你想要col1-3对应每个的min(col4) COL3?

类似的东西:

select X.col1, X.col2, X.col3, X.col4 from table X 
join (select col3, min(col4) as mcol4 from table where col2='xxx' group by col3) as Y
on X.col3=Y.col3 and X.col4=Y.mcol4
where X.col2='xxx';