sql >> Databáze >  >> RDS >> Mysql

Jak se výsledky smísí mezi dvěma tabulkami při použití UNION

Pokud chcete střídat řádky z výsledků sjednocení, budete muset každému z nich přiřadit hodnost, která se zvýší o dvě – jedna pro šance, jedna pro sudé.

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 vypadá, že nefunguje, jinak bych vytvořil demo, ale mělo by to fungovat.

@rank a @rank2 jsou proměnné. @rank2 := @rank2 + 2 přírůstky @rank od 2 pro každý řádek v sadě výsledků a zahrne do výsledků novou hodnotu.from table2, (select @rank2 := 0) q je jen způsob, jak vynutit inicializaci proměnné na 0 aniž byste museli spouštět další dotazy. Spuštěním počítadla pořadí na -1 pro první dotaz a -0 pro druhý dotaz obdrží každý řádek v prvním dotazu pořadí v sekvenci 1,3,5,7,... a každý řádek v druhém dotazu obdrží pořadí v sekvenci 2,4,6,8,...

příklad

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

a údaje:

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 výsledek:

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. Jak vytvořit jedinečné omezení pouze pro část data a času?

  2. Dotaz MySQL funguje v phpmyadmin, ale ne v php

  3. C# SQLServer načte výsledky a umístí je ve formátu .csv

  4. Velikost indexu PostgreSQL a číslo hodnoty