gpt4 book ai didi

php - 使用 UNION 时结果如何在两个表之间混合

转载 作者:行者123 更新时间:2023-11-29 22:33:01 25 4
gpt4 key购买 nike

我想使用 UNION 在一个查询中选择两个表。然后我希望我的结果从两个表中混合(交替排序)。事实上,我希望第一行结果来自 table1,第二行来自 table2,如下所示(重点关注输出顺序):

当我只使用时:

SELECT * 
FROM table1
WHERE column1 = 'anything'

然后 echo id,我的输出例如:2,4,6

当我只使用时:

SELECT * 
FROM table2
WHERE column1 = 'anything'

然后 echo id,我的输出例如:5,6,7

现在如何使用 UNION 和 ORDER BY 对输出进行排序,如下所示:2,5,4,6,6,7

最佳答案

如果您想交替并集结果中的行,则需要为每个行指定一个增加 2 的排名 - 一个表示奇数,一个表示偶数。

select @rank := @rank + 2 `rank`, *
from table1, (select @rank := -1) q
where column1 = 'anything'
union all
select @rank2 := @rank2 + 2 `rank`, *
from table2, (select @rank2 := 0) q
where column1 = 'anything'
order by rank asc;

sqlfiddle 看起来已经关闭,否则我会创建一个演示,但它应该可以工作。

@rank@rank2 是变量。 @rank2 := @rank2 + 2 对于结果集中的每一行,将 @rank 增加 2,并将新值包含在结果中。from table2, (select @rank2 := 0) q 只是一种强制变量初始化为 0 的方法,而无需运行其他查询。通过在第一个查询的 -1 和第二个查询的 -0 处启动排名计数器,第一个查询中的每一行都会收到序列 中的排名1,3,5,7,...,第二个查询中的每一行都会收到序列 2,4,6,8,...

示例

mysql> create table table1 (id integer primary key auto_increment, column1 varchar(25));
Query OK, 0 rows affected (0.08 sec)

mysql> create table table2 (id integer primary key auto_increment, column1 varchar(25));
Query OK, 0 rows affected (0.08 sec)

mysql> insert into table1 (column1) values ('abcd'), ('lmno'), ('abcd'), ('lmno'), ('pqr');
Query OK, 5 rows affected (0.03 sec)
Records: 5 Duplicates: 0 Warnings: 0

mysql> insert into table2 (column1) values ('lmno'), ('abcd'), ('abcd'), ('lmno'), ('abcd'), ('abcd'), ('abcd');
Query OK, 7 rows affected (0.05 sec)
Records: 7 Duplicates: 0 Warnings: 0

和数据:

mysql> select * from table1;
+----+---------+
| id | column1 |
+----+---------+
| 1 | abcd |
| 2 | lmno |
| 3 | abcd |
| 4 | lmno |
| 5 | pqr |
+----+---------+
5 rows in set (0.00 sec)

mysql> select * from table2;
+----+---------+
| id | column1 |
+----+---------+
| 1 | lmno |
| 2 | abcd |
| 3 | abcd |
| 4 | lmno |
| 5 | abcd |
| 6 | abcd |
| 7 | abcd |
+----+---------+
7 rows in set (0.00 sec)

结果:

mysql> select @rank := @rank + 2 `rank`, id from table1, (select @rank := -1) q where column1 = 'abcd' union select @rank2 := @rank2 + 2 `rank`, id from table2, (select @rank2 := 0) q where column1 = 'abcd' order by rank asc;
+------+----+
| rank | id |
+------+----+
| 1 | 1 |
| 2 | 2 |
| 3 | 3 |
| 4 | 3 |
| 6 | 5 |
| 8 | 6 |
| 10 | 7 |
+------+----+
7 rows in set (0.00 sec)

关于php - 使用 UNION 时结果如何在两个表之间混合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29670500/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com