【问题标题】:MySQL: Why does where clause in subselect on result of another subselect not work?MySQL:为什么子选择中的 where 子句对另一个子选择的结果不起作用?
【发布时间】:2013-12-10 13:38:38
【问题描述】:

我有这个选择语句:

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

【问题讨论】:

    标签: mysql sql subquery correlated-subquery


    【解决方案1】:
    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

    【讨论】:

    • 这不会导致每个 A.id 都有相同的 5 个 B.Id 吗?
    • well unique 是 sql 中的粗体字。我在上面编辑了我的文字。如果两个或多个 A.id 有相同的 B.id 也没关系,但这应该是巧合。它是一行(子选择/子字符串)还是 5(连接)也没有关系
    【解决方案2】:

    请查看此帖子以选择随机行:How to randomly select rows in SQL? 然后您可以将这些与其他表连接

    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
    • 对不起,我误解了你的问题。我以为你使用了连接表。
    • @raphael-althaus:我使用此查询来建立关系。 A 就像足球队,B 就像赞助商。在赛季开始时,我希望每支球队都能获得 5 份赞助商报价
    • @MartinWeber 问题是:A 和 B 之间是否存在关系(在此查询之前)?
    猜你喜欢
    • 1970-01-01
    • 2023-03-07
    • 1970-01-01
    • 2015-10-26
    • 2022-06-17
    • 2018-04-30
    • 2015-10-25
    • 1970-01-01
    • 2013-09-04
    相关资源
    最近更新 更多