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

入力配列がmysqlで見つかったものと見つからなかったものをすべて選択する方法

    ヘルパーテーブルは左結合/右結合の概念に使用されますが、それほど単純ではありませんでした。

    ここでの私の答えから(Edit3)ここ

    CREATE TABLE 4kTable
    (   -- a helper table of about 4k consecutive ints
        id int auto_increment primary key,
        thing int null
    )engine=MyISAM;
    
    insert 4kTable (thing) values (null),(null),(null),(null),(null),(null),(null),(null),(null);
    insert 4kTable (thing) select thing from 4kTable;
    insert 4kTable (thing) select thing from 4kTable;
    insert 4kTable (thing) select thing from 4kTable;
    insert 4kTable (thing) select thing from 4kTable;
    insert 4kTable (thing) select thing from 4kTable;
    insert 4kTable (thing) select thing from 4kTable;
    insert 4kTable (thing) select thing from 4kTable;
    insert 4kTable (thing) select thing from 4kTable;
    insert 4kTable (thing) select thing from 4kTable;
    -- verify:
    -- select min(id),max(id),count(*) from 4kTable;
    -- 1 4608 4608
    
    ALTER TABLE 4kTable ENGINE = InnoDB; -- *********** it is now InnoDB
    

    ユーザーfthiella からの変更された回答から ... ここに投稿

    select SUBSTRING_INDEX(SUBSTRING_INDEX(@str, ',', 4k.id), ',', -1) name 
    from 
      4kTable 4k  
      cross join (select @str:='SMITH,WARD,KING,TOM') vars 
      on CHAR_LENGTH(@str) 
         -CHAR_LENGTH(REPLACE(@str, ',', ''))>=4k.id-1; 
    +-------+
    | name  |
    +-------+
    | SMITH |
    | WARD  |
    | KING  |
    | TOM   |
    +-------+
    

    したがって、上記はcsvをクエリに挿入し、そこからテーブルを生成する一般的な形式です。

    次に、派生テーブルを作成します(d )上記のうち、RIGHT JOINを介して結合します オペコード付き(そのスキーマはオペコードで表示されていました)

    select d.name as rtable_name,e.empno,e.ename,e.job,e.mgr,e.hiredate,e.sal,e.comm,e.deptno 
    from emp e 
    right join 
    (   select SUBSTRING_INDEX(SUBSTRING_INDEX(@str, ',', 4k.id), ',', -1) name  
        from 4kTable 4k  
        cross join (select @str:='SMITH,WARD,KING,TOM') vars 
        on CHAR_LENGTH(@str) 
            -CHAR_LENGTH(REPLACE(@str, ',', ''))>=4k.id-1 
    ) d 
    on d.name=e.ename; 
    

    結果:

    +-------------+-------+-------+-----------+------+------------+---------+--------+--------+
    | rtable_name | empno | ename | job       | mgr  | hiredate   | sal     | comm   | deptno |
    +-------------+-------+-------+-----------+------+------------+---------+--------+--------+
    | SMITH       |  7369 | SMITH | CLERK     | 7902 | 1980-12-17 |  800.00 |   NULL |     20 |
    | WARD        |  7521 | WARD  | SALESMAN  | 7698 | 1981-02-22 | 1250.00 | 500.00 |     30 |
    | KING        |  7839 | KING  | PRESIDENT | NULL | 1981-11-17 | 5000.00 |   NULL |     10 |
    | TOM         |  NULL | NULL  | NULL      | NULL | NULL       |    NULL |   NULL |   NULL |
    +-------------+-------+-------+-----------+------+------------+---------+--------+--------+
    



    1. 6000万エントリ、特定の月からのエントリを選択します。データベースを最適化する方法は?

    2. OracleAppsR12でSSLまたはTLSを有効にする

    3. MicrosoftAccessIDEに愛を与える時が来ました

    4. Doctrine-プリペアドステートメントだけでなく、実際のSQLを出力する方法は?