【问题标题】:Random row with group by?随机行与分组?
【发布时间】:2020-06-20 06:41:15
【问题描述】:

我尝试使用 SQL 和 PHP 显示每个组的随机行。 组是我数据库中的一个“类别”。

我用这个:

SELECT * 
FROM images i, set s
WHERE i.ImageSetId = s.SetId
GROUP BY s.SetCategorie
ORDER BY rand()

使用此代码,每个类别都有一行,但它总是返回第一行,我不明白如何为每个类别显示随机行。 有人可以帮帮我吗?

ps:我已经尝试过使用日期和 GROUP BY rand('e.SetCategorie') 的其他方法,但它根本不起作用。

在此先感谢并原谅我的英语:p

【问题讨论】:

标签: mysql sql random group-by greatest-n-per-group


【解决方案1】:

你需要过滤而不是聚合。

在 MySQL 8.0 中,您可以使用窗口函数:

SELECT *
FROM (
    SELECT 
        i.*, 
        s.*,
        row_number() over(partition by s. SetCategorie Order by rand()) rn
    FROM images i
    INNER JOIN set s ON i.ImageSetId = s.SetId
) t
WHERE rn = 1

在早期版本中,它要复杂得多。这是一个使用 partial group by 的 hacky 解决方案:

SELECT *
FROM (
    SELECT 
        i.*, 
        s.*
    FROM images i
    INNER JOIN set s ON i.ImageSetId = s.SetId
    ORDER BY RAND()
) t
GROUP BY SetCategorie

【讨论】:

  • 您好,我知道我不能以这种方式使用“group by”,感谢您的建议,但我尝试将您的代码用于“早期版本”,但它没有给我一行每个类别。 (有时它是同一类别,有时我有 4 行......)。无论如何,我注意到我必须搜索“SQL过滤”而不是分组,谢谢!我会寻找解决方案。
  • @DannyLaRose:我看到了问题所在。为每一行执行相关子查询,并且不会产生稳定的结果集。我更改了查询以使用另一种技术,如果效果更好,请告诉我。
  • 谢谢,GMB,但我之前已经尝试过了,它总是返回相同的行(每个类别的第一行)。这可能是因为“GROUP BY”。
  • @DannyLaRose:仔细看,这和你的查询不一样。有一个带有ORDER BY RAND() 的子查询,然后是一个带有GROUP BY 的外部查询。请根据您的真实数据尝试此查询。
  • 对不起,我之前没说清楚^^ 我试过了,它总是给我每个类别的第一行,就像我在第一篇文章中使用的代码一样。也许在 SQL 中为每个类别都有一个随机行是不可能的:'(我会尝试使用日期。如果我为 ImageSet 添加列日期,也许我至少可以为每个类别发布最后一张图片总是相同的第一行。
猜你喜欢
  • 1970-01-01
  • 2014-12-30
  • 1970-01-01
  • 2016-11-21
  • 1970-01-01
  • 2015-12-14
  • 2016-04-15
  • 2018-03-14
  • 2020-08-17
相关资源
最近更新 更多