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

Php 使用UNION时,结果如何在两个表之间混合,php,mysql,sql,Php,Mysql,Sql,我想使用UNION在一个查询中选择两个表。然后我想从两个表中混合我的结果(交替排序)。实际上,我希望结果的第一行来自表1,第二行来自表2,如下所示(关注输出顺序): 当我只使用: SELECT * FROM table1 WHERE column1 = 'anything' SELECT * FROM table2 WHERE column1 = 'anything' 然后是echo id,我的输出是例如:2,4,6 当我只使用: SELECT * FROM table1 WHE

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

当我只使用:

SELECT * 
FROM table1 
WHERE column1 = 'anything'
SELECT * 
FROM table2 
WHERE column1 = 'anything'
然后是echo id,我的输出是例如:2,4,6

当我只使用:

SELECT * 
FROM table1 
WHERE column1 = 'anything'
SELECT * 
FROM table2 
WHERE column1 = 'anything'
然后是echo id,我的输出是例如:5,6,7


现在,如何使用UNION和ORDER BY对输出进行如下排序:2,5,4,6,6,7如果要从UNION的结果中交替行,则需要为每个行指定一个增加2的等级-赔率为1,偶数为1

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
2
为结果集中的每一行增加
@rank
,并在结果中包含新值。
从表2中,(选择@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)

哪个数据库管理系统?此外,您需要联合所有人来保持这两个6。什么是“dbms”?你说得对,我应该用UNION ALL来保持这两个6。tnxDbms,您正在使用的数据库产品!数据库管理系统。Google it:)我使用mysql(phpmyadmin)你的想法很好,但我不太懂sql,所以我无法实现这个。什么是??什么是:=?:)!!我很高兴。无论如何,tnxalot@Fatemeh我只是将一些示例输出粘贴为well@Fatemeh
@rank
是一个变量,
:=
分配给该变量。因此,对于每一行,执行
@rank:=@rank+2
,并且rank的值增加。答案中增加了额外的解释哇,你太完美了!!!!!我做到了,而且工作正常。Tnx很多。。。。我已经卷入这个问题一周了!!!!帕拉先生,一切都好,你能告诉我:1。如果我有3个表,应该更改哪些参数?2.(选择@rank2:=0)q的平均值是多少