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

同様の演算子を使用せずに、複数の単一または参照のデータを取得する

    次のことを考慮してください

    mysql> select * from employee ;
    +------+------+--------+
    | id   | name | skills |
    +------+------+--------+
    |    1 | xyz  | 1,2,4  |
    |    2 | abc  | 1,3    |
    |    3 | lmn  | 1,2,3  |
    +------+------+--------+
    3 rows in set (0.00 sec)
    
    mysql> select * from skillset ;
    +------+----------+
    | id   | skillset |
    +------+----------+
    |    1 | Python   |
    |    2 | Java     |
    |    3 | C        |
    |    4 | PHP      |
    +------+----------+
    4 rows in set (0.00 sec)
    

    この構造はあなたの構造に似ており、このような状況でクエリを実行するには、find_in_setを使用できます。 しかし、それはかなり非効率的です。ここにいくつかの例があります

    mysql> select e.id,
    e.name, 
    group_concat(s.skillset) as skillset 
    from employee e join skillset s 
    on find_in_set(s.id,e.skills) > 0 
    where find_in_set(1,e.skills) > 0 
     group by e.id ;
    +------+------+-----------------+
    | id   | name | skillset        |
    +------+------+-----------------+
    |    1 | xyz  | Python,Java,PHP |
    |    2 | abc  | C,Python        |
    |    3 | lmn  | Java,Python,C   |
    +------+------+-----------------+
    3 rows in set (0.00 sec)
    
    select e.id,
    e.name, 
    group_concat(s.skillset) as skillset 
    from employee e 
    join skillset s on find_in_set(s.id,e.skills) > 0 
    where find_in_set(2,e.skills) > 0  group by e.id ;
    +------+------+-----------------+
    | id   | name | skillset        |
    +------+------+-----------------+
    |    1 | xyz  | Python,PHP,Java |
    |    3 | lmn  | C,Java,Python   |
    +------+------+-----------------+
    

    これで、適切な正規化によって作業がはるかに簡単になり、次の関連付けテーブルが作成されます

    mysql> select * from employee_skills; 
    +------------+----------+
    | idemployee | idskills |
    +------------+----------+
    |          1 |        1 |
    |          1 |        2 |
    |          1 |        3 |
    |          2 |        1 |
    |          2 |        3 |
    |          3 |        1 |
    |          3 |        2 |
    |          3 |        3 |
    +------------+----------+
    

    この場合、クエリを実行する方がはるかに効率的です

    mysql> select e.id,
    e.name,
    s.skillset from employee e 
    join employee_skills es on es.idemployee = e.id 
    join skillset s on s.id = es.idskills where s.id = 1 ;
    +------+------+----------+
    | id   | name | skillset |
    +------+------+----------+
    |    1 | xyz  | Python   |
    |    2 | abc  | Python   |
    |    3 | lmn  | Python   |
    +------+------+----------+
    

    最後のアプローチを使用すると、より複雑な計算を非常に簡単に行うことができます。



    1. 次および前の要素のクエリを最適化する

    2. SQLAlchemy Integerフィールドを使用して、フィルタリング用のtimedeltaオブジェクトを作成します

    3. brew install mysql、サーバーを停止しようとするとエラーが発生します

    4. PostgreSQLで大規模な非ブロッキング更新を行うにはどうすればよいですか?