首页 > 解决方案 > 多次使用 ANY_VALUE 时的 MySQL 行为

问题描述

GROUP BY在 MySQL 5.7 中使用时,我想为每个组获取一个随机行。从我的研究来看,最干净的方法是做这样的事情:

SELECT ANY_VALUE(column_1), ANY_VALUE(column_2), ..., ANY_VALUE(column_n)
FROM table
GROUP BY column

由于没有类似的语法,ANY_VALUE(*)或者ANY_VALUE(column_1, column2, ..., column_n)如果使用上述查询,每个值都可以来自不同的行,或者所有ANY_VALUE字段都来自同一行,我会感到困惑。

标签: mysqlsqldatabase

解决方案


如果您想要一个随机行,请使用row_number()

select t.*
from (select t.*,
             row_number() over (partition by column order by rand()) as seqnum
      from t
     ) t
where seqnum = 1;

我猜这也比 快group by,但您可以检查是否是这种情况。

在 MySQL 5.7 中,您可以使用变量:

select t.*
from (select t.*,
             (@rn := if(@c = column, @rn + 1,
                        if(@c := column, 1, 1)
                       )
             ) as rn
      from (select t.* from t order by column, rand) t cross join
           (select @c := '', @rn := 0) params
     ) t
where rn = 1;

推荐阅读