簡體   English   中英

如何將多個SELECT結果相結合?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM