sql >> データベース >  >> RDS >> Mysql

UNIONを使用したときに結果が2つのテーブル間でどのように混合されるか

    和集合の結果から行を交互にしたい場合は、それぞれに2ずつ上がるランクを付ける必要があります。1つはオッズ、もう1つは偶数です。

    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がダウンしているように見えます。それ以外の場合はデモを作成しますが、機能するはずです。

    @rank および@rank2 変数です。 @rank2 := @rank2 + 2 @rankをインクリメントします 2による 結果セットのすべての行に対して、結果に新しい値が含まれます。from table2, (select @rank2 := 0) q 変数を強制的に0に初期化する方法にすぎません。 追加のクエリを実行する必要はありません。 -1でランクカウンターを開始する 最初のクエリの場合、および-0 2番目のクエリの場合、最初のクエリの各行は、シーケンス1,3,5,7,...のランクを受け取ります。 、および2番目のクエリのすべての行は、シーケンス2,4,6,8,...のランクを受け取ります。

    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
    

    およびデータ:

    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)
    

    結果:

    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. Hibernate:ネイティブの一括操作クエリを実行できませんでした

    2. OracleでJavaストアドプロシージャをデバッグする方法

    3. データベース列に複数のアイテムを保存するにはどうすればよいですか?

    4. Elasticsearchでメールや電話をあいまい一致させる方法は?