首先,我对SQL并不熟悉,所以这可能是一个初学者的问题。
我知道如何选择按ID排序的数据:SELECT * FROM foo ORDER BY id LIMIT 100
以及如何选择随机子集:SELECT * FROM foo ORDER BY RAND() LIMIT 100
。
我想以拉链方式将这两个查询合并为1,从每个中选择limit / 2(即50)。例如:
0
85
1
35
2
38
3
19
4
...
我想避免重复。最简单的方法可能是在查询中检索随机排序行的部分添加WHERE id > 100/2
。
附加信息:不知道存在多少行。
答案 0 :(得分:2)
要获得“zip-manner”合并,请为每个查询添加生成的rownumber,并使用rownnumber的订单联合。
对另一个查询使用偶数和一个奇数。
试试这个MySQL
SELECT
@rownum0:=@rownum0+2 rn,
f.*
FROM ( SELECT * FROM foo ORDER BY id ) f, (SELECT @rownum0:=0) r
UNION
SELECT @rownum1:=@rownum1+2 rn,
b.*
FROM ( SELECT * FROM bar ORDER BY RAND() ) b, (SELECT @rownum1:=-1) r
ORDER BY rn
LIMIT 100
答案 1 :(得分:0)
这应该是自我解释但不会删除重复:
select @rownum:=@rownum+1 as rownum,
(@rownum-1) % 50 as sortc, u.id
from (
(select id from player order by id limit 50)
union all
(select id from player order by rand() limit 50)) u,
(select @rownum:=0) r
order by sortc,rownum;
如果将“union all”替换为“union”,则删除重复项,但结果会减少行数。
这将处理重复项,不会限制ID中的随机数> 50,并始终返回100行:
SELECT @rownum := @rownum + 1 AS rownum,
( @rownum - 1 ) % 50 AS sortc,
u.id
FROM ((SELECT id
FROM foo
ORDER BY Rand()
LIMIT 50)
UNION
(SELECT id
FROM foo
WHERE id <= 100
ORDER BY id)) u,
(SELECT @rownum := 0) r
WHERE @rownum < 100
ORDER BY sortc,
rownum DESC
LIMIT 100;
答案 2 :(得分:-1)
SELECT * FROM foo ORDER BY id LIMIT 50 UNION SELECT * FROM foo ORDER BY RAND() LIMIT 50
如果我理解你的要求。 UNION自行删除重复项