【问题标题】:mysql-select a random row from each idmysql-从每个id中选择一个随机行
【发布时间】:2020-09-23 05:45:51
【问题描述】:

我的数据库中有一个表,它有 2 列:idcolor。每个id 可能有多个具有不同color 值的行。比如:

id     color
--------------
1      black
1      white
1      green
2      yellow
3      red
3      black

我只想为每个id 选择一行,但是是随机的。我已经尝试过使用两个选择查询,但它总是返回每个 id 的第一行。什么问题?!

SELECT * FROM (SELECT * FROM collections ORDER BY RAND()) AS a
GROUP BY id

【问题讨论】:

    标签: mysql sql select subquery greatest-n-per-group


    【解决方案1】:

    你可以试试:

    select t.*
    from t
    where t.color = (select t2.color
                     from t t2
                     where t2.id = t.id
                     order by rand()
                     limit 1
                    );
    

    为了提高性能,您可以尝试使用(id, color) 上的索引。

    您的代码根本不应该工作。它使用select *group by——这意味着你有未聚合的列。那应该是编译时错误。

    编辑:

    哈哈。当然,上面有一个问题。为每一行调用子查询,使每一行都有机会出现在结果集中。叹。有时代码不会做我想做的事。一种解决方案是播种随机数生成器。这是“任意”而非“随机”——每次运行都会得到相同的值:

    select t.*
    from t
    where t.color = (select t2.color
                     from t t2
                     where t2.id = t.id
                     order by rand(concat(t2.id, t2.color))
                     limit 1
                    );
    

    如果你没有太多颜色,你可以使用group_concat()技巧:

    select t.id,
           substring_index(group_concat(color order by rand()), ',', 1)
    from tA quick and dirty solution is to seed the random number generator:
    group by id;
    

    【讨论】:

    • 谢谢。但是对于某些 id,它返回不止一行,并且每次运行它时,它都会返回不同数量的行作为结果
    • @Soheil 。 . .仅当 color 有多于一行时,这将返回多行。您的样本数据没有此类示例,因此这符合您提出的问题。如果出现问题,您可以使用主键代替 color(您的示例数据没有)。
    • 不,颜色值在整个表格中是唯一的。但此查询仍然为某些 id 返回多行
    • @Soheil 。 . .啊。说明为什么它不起作用。
    猜你喜欢
    • 1970-01-01
    • 2012-12-24
    • 1970-01-01
    • 1970-01-01
    • 2013-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多