Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana hasil tercampur di antara dua tabel saat menggunakan UNION

Jika Anda ingin mengganti baris dari hasil gabungan, Anda harus memberi masing-masing peringkat yang meningkat dua - satu untuk peluang, satu untuk genap.

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 tampaknya tidak berfungsi, jika tidak saya akan membuat demo, tetapi seharusnya berhasil.

@rank dan @rank2 adalah variabel. @rank2 := @rank2 + 2 peningkatan @rank oleh 2 untuk setiap baris dalam kumpulan hasil, dan menyertakan nilai baru dalam hasil.from table2, (select @rank2 := 0) q hanyalah cara untuk memaksa variabel diinisialisasi ke 0 tanpa harus menjalankan kueri tambahan. Dengan memulai penghitung peringkat di -1 untuk kueri pertama, dan -0 untuk kueri kedua, setiap baris dalam kueri pertama menerima peringkat dalam urutan 1,3,5,7,... , dan setiap baris dalam kueri kedua menerima peringkat dalam urutan 2,4,6,8,...

contoh

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

dan datanya:

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)

dan hasilnya:

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. Pelanggaran batasan integritas:1048 Kolom 'user_id' tidak boleh terjadi kesalahan nol saat menetapkan peran (Laravel 5.3)

  2. Bagaimana cara menambahkan nol di depan ke panjang char yang berbeda di mysql?

  3. Kolom pembaruan MySQL pada kemunculan pertama setiap nama pengguna

  4. Bagaimana menemukan perbedaan antara dua tabel MySQL menggunakan pernyataan MySQL?

  5. UPDATE atau INSERT MySQL Python