gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:31:39 25 4
gpt4 key购买 nike

我有一个表A,其中有表B的外键,我需要从A中选择10个随机字段,这样字段连续的对具有不同的 b_id,即有效结果为:(x1, x2) (x3, x4) ... (xn, xn+1) 其中 xi 是选定的字段,如果我们命名为 fixi 的外键改为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

最佳答案

我认为你的查询很好,除了 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

关于mysql - 选择连续对具有不同外键的随机字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17384393/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com