Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment les résultats sont mélangés entre deux tables lors de l'utilisation de UNION

Si vous souhaitez alterner les lignes des résultats d'une union, vous devrez attribuer à chacune d'elles un rang qui augmente de deux - un pour les cotes, un pour les pairs.

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 semble être en panne sinon je créerais une démo, mais cela devrait fonctionner.

@rank et @rank2 sont variables. @rank2 := @rank2 + 2 incrémente @rank par 2 pour chaque ligne du jeu de résultats et inclut la nouvelle valeur dans les résultats.from table2, (select @rank2 := 0) q est juste un moyen de forcer la variable à être initialisée à 0 sans avoir à exécuter de requêtes supplémentaires. En démarrant le compteur de rang à -1 pour la première requête, et -0 pour la deuxième requête, chaque ligne de la première requête reçoit un rang dans la séquence 1,3,5,7,... , et chaque ligne de la deuxième requête reçoit un rang dans la séquence 2,4,6,8,...

exemple

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

et les données :

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)

et le résultat :

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)