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

Come i risultati vengono mischiati tra due tabelle quando si usa UNION

Se vuoi alternare le righe dei risultati di un'unione, dovrai assegnare a ciascuna di esse un rango che aumenta di due:una per le quote, una per i pari.

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 sembra essere inattivo, altrimenti creerei una demo, ma dovrebbe funzionare.

@rank e @rank2 sono variabili. @rank2 := @rank2 + 2 incrementi @rank per 2 per ogni riga nel set di risultati e include il nuovo valore nei risultati.from table2, (select @rank2 := 0) q è solo un modo per forzare l'inizializzazione della variabile su 0 senza dover eseguire query aggiuntive. Avviando il contatore di rango da -1 per la prima query e -0 per la seconda query, ogni riga della prima query riceve un rango nella sequenza 1,3,5,7,... e ogni riga della seconda query riceve un rango nella sequenza 2,4,6,8,...

esempio

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

e i dati:

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)

e il risultato:

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)