选择连续对具有不同外键的随机字段

时间:2013-06-29 20:30:01

标签: mysql sql

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

这是我目前的查询:

fk+1

1 个答案:

答案 0 :(得分:0)

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

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

  1. 将结果保存在临时表中
  2. 将第一列与第二列合并,标记它来自哪个
  3. 按顺序从联盟中选择
  4. 我在下面列举了一个例子。用您的查询替换插入行。

    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