sql >> Database teknologi >  >> RDS >> Mysql

Hvordan resultaterne bliver blandet mellem to tabeller, når du bruger UNION

Hvis du vil skifte rækker fra resultaterne af en union, skal du give hver af dem en rang, der stiger med to - en for odds, en for lige.

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 ud til at være nede, ellers ville jeg lave en demo, men det burde virke.

@rank og @rank2 er variable. @rank2 := @rank2 + 2 trin @rank af 2 for hver række i resultatsættet, og inkluderer den nye værdi i resultaterne.from table2, (select @rank2 := 0) q er blot en måde at tvinge variablen til at blive initialiseret til 0 uden at skulle køre yderligere forespørgsler. Ved at starte rangtælleren ved -1 for den første forespørgsel, og -0 for den anden forespørgsel modtager hver række i den første forespørgsel en rangering i rækkefølgen 1,3,5,7,... , og hver række i den anden forespørgsel modtager en rang i sekvensen 2,4,6,8,...

eksempel

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

og dataene:

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)

og 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. Hent manglende datoer fra databasen via MySQL

  2. Eksternt Oracle-tabeleksempel

  3. PostgreSQL:eksporter resulterende data fra SQL-forespørgsel til Excel/CSV

  4. PostgreSQL 13:Lad ikke slots dræbe din primære