我认为您的查询很好,除了order by rand()
,它将为您的所有行分配一个随机值,然后在获取前 5 行之前对它们进行排序。当您只需要 5 行时,这非常昂贵。这个问题有更有效的方法从 MySQL 获取随机行:如何优化 MySQL 的 ORDER BY RAND() 函数?
生成此两列查询后,您可以通过以下方式将其转换为单列查询:
- 将结果保存在临时表中
- 将第一列合并到第二列,标记它的来源
- 按顺序从联合中选择
我在下面包含了一个示例。用您的查询替换插入行。
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