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

1列にコンマが含まれるSQL結合テーブル

    データベースの正規化を実際に確認する必要があります まず、ジャンクションテーブルを追加して構造を正規化し、tablecからのリレーションを保持します。tablecに格納されている各リレーションは、新しいジャンクションテーブルに格納されますが、コンマ区切りのリストとしてではなく、各行にcのIDと行ごとに1つのユーザーIDが保持されます。スキーマを変更することはできません。find_in_setを使用できます。 セット内の値を検索するには

    select *  
    from  tblC c
    JOIN tblB b
    ON (find_in_set(b.userid,c.userids) > 0)
    where c.nname="new1"
    

    デモを見る

    スキーマを正規化するために編集

    useridsを削除しました tblCの列 代わりに、tblC_userとして新しいジャンクションテーブルを作成しました 2列のc_id これは、tblCのid列に関連します 2つ目はuserid tblCのユーザーリレーションユーザーを保存する tblCのサンプルスキーマを参照してください

    CREATE TABLE if not exists tblC
    (
    id int(11) NOT NULL auto_increment ,
    nname varchar(255),
     PRIMARY KEY (id)
    );
    
    INSERT INTO tblC (id, nname) VALUES
    ('1', 'new1'),
    ('2', 'new2'),
    ('3', 'new3'),
    ('4', 'new4'),
    ('5', 'new5');
    

    そして、これがtblC_userとしてのjunctionテーブルです。

    CREATE TABLE if not exists tblC_user
    (
     c_id int,
     userid int
    );
    
    INSERT INTO tblC_user (c_id,userid) VALUES
    ('1','1'),
    ('1','2'),
    ('2','1'),
    ('2','3'),
    ('3','1'),
    ('3','4'),
    ('4','3'),
    ('4','2'),
    ('5','5'),
    ('5','2');
    

    上記で、tblCのユーザーの各リレーションにコンマ区切りのリレーションが保存されていないことに気付いた場合 は新しい行に格納されます。関係する結果セットについては、結合でジャンクションテーブルを使用しましたが、新しいクエリは次のようになります

    select *  
    from  tblC c
    join tblC_user cu on(c.id = cu.c_id)
    join tblB b on (b.userid = cu.userid)
    where c.nname="new1"
    

    デモ2

    これで、上記のクエリをインデックスを使用して最適化できるようになり、カスケード関係を簡単に維持できます




    1. UNION、EXCEPT、またはINTERSECTを使用している場合、PostgreSQLの「エラー:列「colname」が存在しません」を修正しました

    2. 空の列を検出して削除し、SQL、Oracleのデータベースを更新します

    3. .csvファイルをOracleFormsアプリケーションにインポートする

    4. 最新のJDKアップデート後にJavaがMySQL5.7に接続できないのはなぜですか?また、どのように修正する必要がありますか? (ssl.SSLHandshakeException:適切なプロトコルがありません)