我有一个表A
,其中包含表B
的外键,我需要从A
中选择10个随机字段,以便连续对中的字段具有不同的b_id
,即一个有效的结果将是:
(x1, x2) (x3, x4) ... (xn, xn+1)
其中xi
是所选字段,如果我们将fi
的外键命名为xi
,则B
应与fi
不同{ {1}}。我尝试了一个非常糟糕的查询,我根本不喜欢它,我相信很慢。
这是我目前的查询:
fk+1
答案 0 :(得分:0)
我认为你的查询很好,除了order by rand()
,它会为你的所有行分配一个随机值,然后在获取前5行之前对它们进行排序。当你真的这么做时,这是非常昂贵的需要5行。这个问题有更有效的方法从MySQL获取随机行:How can i optimize MySQL's ORDER BY RAND() function?
生成此两列查询后,您可以通过以下方式将其转换为单列查询:
我在下面列举了一个例子。用您的查询替换插入行。
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