Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie die Ergebnisse zwischen zwei Tabellen gemischt werden, wenn UNION verwendet wird

Wenn Sie Zeilen aus den Ergebnissen einer Vereinigung abwechseln möchten, müssen Sie jeder Zeile einen Rang zuweisen, der um zwei erhöht wird – einen für ungerade, einen für gerade.

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 scheint down zu sein, sonst würde ich eine Demo erstellen, aber es sollte funktionieren.

@rank und @rank2 sind Variablen. @rank2 := @rank2 + 2 erhöht @rank durch 2 für jede Zeile in der Ergebnismenge und fügt den neuen Wert in die Ergebnisse ein.from table2, (select @rank2 := 0) q ist nur eine Möglichkeit, die Initialisierung der Variablen auf 0 zu erzwingen ohne zusätzliche Abfragen ausführen zu müssen. Indem der Rangzähler bei -1 beginnt für die erste Abfrage und -0 für die zweite Abfrage erhält jede Zeile in der ersten Abfrage einen Rang in der Reihenfolge 1,3,5,7,... , und jede Zeile in der zweiten Abfrage erhält einen Rang in der Reihenfolge 2,4,6,8,...

Beispiel

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

und die Daten:

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)

und das Ergebnis:

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)