【问题标题】:Select random fields where consecutive pairs have different foreign keys选择连续对具有不同外键的随机字段
【发布时间】:2013-06-29 20:30:00
【问题描述】:

我有一个表 A 和表 B 的外键,我需要从 A 中选择 10 个随机字段,以便连续对中的字段具有不同的 b_id,即有效结果将是: (x1, x2) (x3, x4) ... (xn, xn+1) 其中xi 是选定的字段,如果我们将fi 的外键命名为xiB,那么fi 应该不同于fk+1。我尝试了一个非常糟糕的查询,我根本不喜欢它而且我相信它很慢。

这是我当前的查询:

select a1.b_id, a1.x, a2.b_id, a2.x
from A a1, A a2
where a1.b_id <> a2.b_id
order by rand()
limit 5

【问题讨论】:

    标签: mysql sql


    【解决方案1】:

    我认为您的查询很好,order by rand() 除外,它将为您的所有行分配一个随机值,然后在获取前 5 行之前对它们进行排序。当您只需要 5 时,这非常昂贵行。这个问题有更有效的方法从 MySQL 中获取随机行:How can i optimize MySQL's ORDER BY RAND() function?

    生成此两列查询后,您可以通过以下方式将其转换为单列查询:

    1. 将结果保存在临时表中
    2. 将第一列合并到第二列,标记它的来源
    3. 按顺序从联合中选择

    我在下面包含了一个示例。用您的查询替换插入行。

    create temporary table x (
      x1 int, x2 int);
    
    insert x values (1, 2), (3, 4), (5, 6) ,(7, 8), (9, 10);
    
    select v 
    from (
      SELECT
        x1 AS v,
        1 AS pairPosition,
        @curRow1 := @curRow1 + 1 AS row_number
      FROM x
      JOIN    (SELECT @curRow1 := 0) r
    
      UNION
    
      SELECT
        x2 AS v,
        2 AS pairPosition,
        @curRow2 := @curRow2 + 1 AS row_number
      FROM x
      JOIN    (SELECT @curRow2 := 0) r
    ) xx
    order by xx.row_number asc, pairposition asc
    

    【讨论】:

    • 感谢您的回复。现在我有一个新问题,可以作为一个新问题提出:我需要选择一对作为单列,即x1, x2, x3, x4, ... xn, xn+1,而不是像我原来的问题那样两个。有什么想法吗?
    • @e.campver 我已经用一种粗略的方法更新了我的答案,将 2 列解决方案更改为单列。不幸的是,我不得不使用临时表,因为我想到的解决方案(unpivot、cte 或临时变量)不在 MySQL 中。连行号都难看。
    猜你喜欢
    • 1970-01-01
    • 2019-03-15
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 2021-12-16
    • 2013-03-11
    • 1970-01-01
    • 2021-05-02
    相关资源
    最近更新 更多