如何混合多个SELECT结果?

时间:2011-01-15 15:06:59

标签: sql mysql

首先,我对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

附加信息:不知道存在多少行。

3 个答案:

答案 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自行删除重复项