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

时间:2013-12-10 13:38:38

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

2 个答案:

答案 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

示例:http://sqlfiddle.com/#!2/d7df9/9

答案 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