MySQL:为什么子选择中的where子句在另一个子选择的结果上不起作用?

MySQL:为什么子选择中的where子句在另一个子选择的结果上不起作用?,mysql,sql,subquery,correlated-subquery,Mysql,Sql,Subquery,Correlated Subquery,我有这样一句话: 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

我有这样一句话:

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接受查询并给出错误的结果。

请查看此帖子以选择随机行:然后可以将这些行与另一个表连接起来

SELECT B.id
FROM B JOIN A ON B.id=A.id
ORDER BY RAND()
LIMIT 5

示例:

1。结果中没有b1、b2、b3、b4、b5列。2.你在哪里看到有问题的B.Id=A.Id?他们似乎没有关系(这很奇怪,但是…为什么没有)。谢谢你,我已经读过了。问题是,每个A.id都连接到相同的五个B.id。每个A.Id我需要5个不同的B.Id如果两个A.Id有相同的5个B.Id没关系,但这应该是巧合。对不起,我误解了你的问题。我以为您使用了连接表。@raphael althaus:我使用这个查询来建立关系。A像足球队,B像赞助商。在赛季初,我希望每支球队都能得到5名赞助商-offers@MartinWeber问题是:a和B之间是否存在关系(在此查询之前)?这不会导致每个a.id都具有相同的5个B.id吗?唯一性在sql中是一个粗体字。我编辑了上面的文字。如果两个或多个A.id具有相同的B.id是可以的,但这应该是巧合。它是一行(子选择/子字符串)还是5行(联接)也不重要
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