Php 使用UNION时,结果如何在两个表之间混合
我想使用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
表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的平均值是多少