sql >> Database >  >> RDS >> Mysql

Hoe de resultaten worden gemengd tussen twee tabellen bij gebruik van UNION

Als je rijen van de resultaten van een unie wilt afwisselen, moet je elk van hen een rang geven die met twee toeneemt - één voor kansen, één voor even.

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 lijkt down te zijn, anders zou ik een demo maken, maar het zou moeten werken.

@rank en @rank2 zijn variabelen. @rank2 := @rank2 + 2 verhoogt @rank door 2 voor elke rij in de resultatenset, en neemt de nieuwe waarde op in de resultaten.from table2, (select @rank2 := 0) q is slechts een manier om te forceren dat de variabele wordt geïnitialiseerd op 0 zonder dat u aanvullende query's hoeft uit te voeren. Door de rangteller te starten op -1 voor de eerste zoekopdracht, en -0 voor de tweede zoekopdracht krijgt elke rij in de eerste zoekopdracht een rangorde in de reeks 1,3,5,7,... , en elke rij in de tweede zoekopdracht krijgt een rangorde in de volgorde 2,4,6,8,...

voorbeeld

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

en de gegevens:

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)

en het resultaat:

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. gematerialiseerde weergave voor jaarverslag creëren op basis van slow function

  2. Praag PostgreSQL Meetup

  3. Minimale afstand en groeperen op

  4. Hoe installeer ik ALLEEN MySQL op Debian GNU/Linux 9 (stretch) zonder MariaDB?