[英]How do I intermerge multiple SELECT results?
首先,我對SQL不很深入,所以這可能是一個初學者的問題。
我知道如何選擇按ID排序的數據: SELECT * FROM foo ORDER BY id LIMIT 100
以及如何選擇隨機子集: SELECT * FROM foo ORDER BY RAND() LIMIT 100
。
我想將這兩個查詢以zip方式合並為1,從每個查詢中選擇limit / 2(即50)。 例如:
0
85
1
35
2
38
3
19
4
...
我想避免重復。 最簡單的方法可能是將WHERE id > 100/2
添加到檢索隨機排序的行的查詢部分。
附加信息:未知存在多少行。
要獲得“ zip-manner”合並,請向每個查詢添加一個生成的行號,並使用按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
這應該是自我說明,但不會刪除重復項:
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 all”,則刪除重復項,但結果是減少了行數。
這將處理重復項,不限制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;
SELECT * FROM foo ORDER BY id LIMIT 50 UNION SELECT * FROM foo ORDER BY RAND() LIMIT 50
如果我正確理解您的要求。 UNION自行刪除重復項
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.