带分组的随机行?

Random row with group by?

我尝试用 SQL 和 PHP 显示每个组的随机行。 组是我数据库中的 "category"。

我用这个:

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

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

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

提前致谢,请原谅我的英语:p

您需要过滤而不是聚合。

在MySQL8.0中,可以使用window函数:

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