【问题标题】:MySQL UNION print every otherMySQL UNION 每隔一个打印一次
【发布时间】:2009-12-16 11:14:16
【问题描述】:

如何进行如下的 sql 查询:

(SELECT `name` FROM table1)
UNION
(SELECT `name` FROM table2)

互相回报。 IE。 name1 来自 table1,name1 来自 table2,name2 来自 table1,name2 来自 table2 等等?

编辑: 表1

name
Hello
world

表2

name
guten
tag

想要的输出:

Hello
guten
world
tag

如果添加更多联合,这也应该是可能的,这样它就从第一个联合开始,然后是第二个,第三个,等等。

【问题讨论】:

  • 不知道你说的“互相退货”是什么意思。能否给出 table1 和 table2 中的一些示例数据,以及所需的输出?

标签: sql mysql


【解决方案1】:

您可以使用变量对行进行编号,联合的第一部分使用 2,4,6,...,第二部分使用 3,5,7,...:

select @rownum1 := @rownum1+2 as rownum, name
from (select @rownum1:=0) r, table1
union all
select @rownum2 := @rownum2+2 as rownum, name
from (select @rownum2:=1) r, table2
order by rownum;

from子句(select @rownum2:=1) r中的select只用于初始化变量。

【讨论】:

  • 非常优雅的rownum交错
【解决方案2】:

这行得通吗?

set @i = 0;
set @j = 1;

select  @i:=@i+2 as rownumber,
        name
from    table1

union

select  @j:=@j+2 as rownumber,
        name
from    table2

order by rownumber

我读到您的问题是希望在结果集中从 table1 中交替一行,从 table2 中交替一行,依此类推。

根据您的编辑进行编辑:

将“2”更改为表的数量,并添加与表一样多的变量,在“set”语句中具有连续的起始值。这将以您想要的方式扩展。

【讨论】:

    【解决方案3】:

    与 David M 类似,您可以这样做:

    (SELECT @rownum:=@rownum+1 as rownum,`name` FROM table1, (SELECT @rownum:=0) r)
    UNION
    (SELECT @rownum:=@rownum+1 as rownum,`name` FROM table2, (SELECT @rownum:=0) r)
    order by rownum
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-07-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多