带分组的随机行?
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
我尝试用 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
:
SELECT *
FROM (
SELECT
i.*,
s.*
FROM images i
INNER JOIN set s ON i.ImageSetId = s.SetId
ORDER BY RAND()
) t
GROUP BY SetCategorie