0

我有一个带有表A外键的表B,我需要从中选择 10 个随机字段,A以便连续对中的字段具有不同b_id的 ,即有效的结果是: 所选字段(x1, x2) (x3, x4) ... (xn, xn+1)在哪里xi,如果我们fi将外键命名为xito B,那么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
4

1 回答 1

0

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

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

  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
于 2013-06-29T21:11:01.327 回答