sql >> Databasteknik >  >> RDS >> Mysql

Hur resultaten blandas mellan två tabeller när du använder UNION

Om du vill växla rader från resultatet av ett fackförbund måste du ge var och en av dem en rankning som ökar med två - en för odds, en för jämnt.

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 ser ut att vara nere annars skulle jag skapa en demo, men det borde fungera.

@rank och @rank2 är variabler. @rank2 := @rank2 + 2 ökar @rank av 2 för varje rad i resultatuppsättningen, och inkluderar det nya värdet i resultaten.from table2, (select @rank2 := 0) q är bara ett sätt att tvinga variabeln att initieras till 0 utan att behöva köra ytterligare frågor. Genom att starta rankningsräknaren vid -1 för den första frågan och -0 för den andra frågan får varje rad i den första frågan en rangordning i sekvensen 1,3,5,7,... , och varje rad i den andra frågan får en rangordning i sekvensen 2,4,6,8,...

exempel

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

och data:

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)

och resultatet:

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)



  1. dbWriteTable(..., append =T) skrivs över i R

  2. Codeigniter gruppera efter och skapa flerdimensionell array

  3. SQL Server 2008 FullTextSearch Enstaka tecken i namnet saknas i resultaten

  4. Infoga data i MySQL-tabellen från Python-skriptet