Mysql
 sql >> Baza danych >  >> RDS >> Mysql

W jaki sposób wyniki mieszają się w dwóch tabelach podczas korzystania z UNION

Jeśli chcesz zamieniać wiersze z wyników związku, musisz nadać każdemu z nich rangę, która wzrasta o dwa – jedną dla szans, drugą dla parzystych.

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 wygląda na to, że nie działa, w przeciwnym razie utworzyłbym demo, ale powinno działać.

@rank i @rank2 są zmiennymi. @rank2 := @rank2 + 2 zwiększa @rank przez 2 dla każdego wiersza w zestawie wyników i uwzględnia nową wartość w wynikach.from table2, (select @rank2 := 0) q to tylko sposób na wymuszenie zainicjowania zmiennej na 0 bez konieczności uruchamiania dodatkowych zapytań. Uruchamiając licznik rang od -1 dla pierwszego zapytania i -0 dla drugiego zapytania każdy wiersz w pierwszym zapytaniu otrzymuje rangę w sekwencji 1,3,5,7,... , a każdy wiersz w drugim zapytaniu otrzymuje rangę w sekwencji 2,4,6,8,...

przykład

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

oraz dane:

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)

a wynik:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nie mogę przypisać indeksu FULLTEXT do mojego stołu

  2. wysyłanie masowych smsów zatrzymuje się w połowie

  3. Przechowuj wyniki MySQL w tablicy PHP dla dwóch zapytań

  4. Jak rozwiązywać problemy z definicjami MySQL

  5. Dynamiczne kolumny w instrukcji SQL Select, zachowujące niezdefiniowane wartości