我有这个选择声明:
select A.id,
(select id from B order by rand() limit 1)b1,
(select id from B where not id in(b1) order by rand() limit 1)b2,
(select id from B where not id in(b1,b2) order by rand() limit 1)b3,
(select id from B where not id in(b1,b2,b3) order by rand() limit 1)b4,
(select id from B where not id in(b1,b2,b3,b4) order by rand() limit 1)b5
from A
它不是很快,它不会给我一个错误,但也不会做我想要的。
我想从表B中读取5个随机id并将它们连接到表A.
到目前为止,我得到了表B中5个id的结果,但是有双打。
即使我有这个应该阻止双打的where子句,我也能得到它们。
例如A.id:1有b1 = 1,b2 = 6,b3 = 1,b4 = 9,B5 = 3
我会理解MySQL是否会抛出错误,因为它无法处理语句,但没有任何内容,所以我认为它应该有效,但事实并非如此。
有人对此有答案吗?
编辑: 如果结果看起来像这样(子查询)并不重要: 1:2,7,3,9,6 或像这样(加入): 1:2 1:7 1:3 1:9 1:6
只要每个A.id都有不同的B.id。两个或更多的A.Id可以使用相同的B.id,但这应该是巧合。
仍然是MySQL接受查询并给出错误结果的问题。
答案 0 :(得分:2)
select id, b1, b2, b3, b4, b5
from (
select A.id,
@ := (select GROUP_CONCAT(DISTINCT id ORDER BY RAND()) AS ids from B),
SUBSTRING_INDEX(SUBSTRING_INDEX(@, ',', 1), ',', -1) b1,
SUBSTRING_INDEX(SUBSTRING_INDEX(@, ',', 2), ',', -1) b2,
SUBSTRING_INDEX(SUBSTRING_INDEX(@, ',', 3), ',', -1) b3,
SUBSTRING_INDEX(SUBSTRING_INDEX(@, ',', 4), ',', -1) b4,
SUBSTRING_INDEX(SUBSTRING_INDEX(@, ',', 5), ',', -1) b5
from A
) t
答案 1 :(得分:0)
请查看此帖子以选择随机行:How to randomly select rows in SQL?然后您可以将其与其他表格加入
SELECT B.id
FROM B JOIN A ON B.id=A.id
ORDER BY RAND()
LIMIT 5