Chr*_*ris 2 mysql sql random join
我有 2 张桌子;“群体”和“价值观”。我正在尝试从值表中随机选择一行,其中 values.groupid = groups.id
我的查询是:
SELECT *
FROM groups as g
inner JOIN
(
SELECT * FROM values as v WHERE v.groupid = g.id ORDER BY RAND() LIMIT 1
) AS rv ON rv.groupid = g.id
Run Code Online (Sandbox Code Playgroud)
v 似乎无法访问 g 我该如何解决这个问题?关于随机,我只设法使 limit 1 解决方案起作用,因为可能会删除 value.id 并且它是小表(最多只有 200 行)。如果我只使用 join on,并且在 join 中没有 where 子句,它将从任何组中选择随机值,或者不返回任何值。谁能帮我?
编辑:这也行不通,因为这次我无法从外部访问 v
SELECT g.*
,(SELECT * FROM v ORDER BY RAND() LIMIT 1)
FROM groups AS g
JOIN
(
SELECT * FROM values
) AS v ON v.groupid = g.id
Run Code Online (Sandbox Code Playgroud)
我看到许多其他非常相似的问题,但实际上没有人尝试对每个组的值进行连接。时间我仍然需要帮助。谢谢你
我总是避免ORDER BY RAND()与 SQL 一起使用,除非您的数据集非常小,否则它会导致糟糕的性能。如果您的数据集那么小,您仍然最好将所有行提取到您的应用程序中并随机选择一行。
这是我刚刚测试过的一个解决方案,它可以从每组中随机选择一行:
SELECT g.*, v.*
FROM Groups AS g
INNER JOIN (
SELECT groupid, COUNT(*) AS c, 1+FLOOR(RAND()*COUNT(*)) AS random
FROM `Values` GROUP BY groupid
) AS c ON g.id = c.groupid
INNER JOIN (SELECT @g:=0, @r:=0) AS init
INNER JOIN (
SELECT IF(groupid<>@g, @r:=1, @r:=@r+1) AS rank, @g:=groupid AS groupid, value
FROM `Values`
ORDER BY groupid
) AS v ON g.id = v.groupid AND c.random = v.rank
Run Code Online (Sandbox Code Playgroud)