Nếu bạn muốn thay thế các hàng từ kết quả của một liên hợp, bạn sẽ cần cung cấp cho mỗi hàng một thứ hạng tăng lên hai - một đối với tỷ lệ cược, một đối với tỷ lệ cược.
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 có vẻ không ổn, nếu không, tôi sẽ tạo một bản demo, nhưng nó sẽ hoạt động.
@rank
và @rank2
là các biến. @rank2 := @rank2 + 2
gia số @rank
bởi 2
cho mọi hàng trong tập kết quả và bao gồm giá trị mới trong kết quả. from table2, (select @rank2 := 0) q
chỉ là một cách để buộc biến được khởi tạo thành 0
mà không cần phải chạy các truy vấn bổ sung. Bằng cách bắt đầu bộ đếm thứ hạng tại -1
cho truy vấn đầu tiên và -0
đối với truy vấn thứ hai, mỗi hàng trong truy vấn đầu tiên nhận được một thứ hạng trong chuỗi 1,3,5,7,...
và mọi hàng trong truy vấn thứ hai nhận được xếp hạng trong chuỗi 2,4,6,8,...
ví dụ
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
và dữ liệu:
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)
và kết quả:
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)