2017-06-26 15 views
0

これが可能かどうかわかりませんが、How to specify the parent query field from within a subquery in mySQL?のアドバイスに従って複数のサブクエリでMySQL SELECTクエリの値を使用しようとしています。各サブクエリには不均等な数の結果がありますが、私はそれがなぜうまくいかないのだろうと考えています。MySQL - 行数が一致しない複数のサブクエリの結果を使用

私のDBは上記の投稿よりも複雑です。 EC番号*値 - - ユニークなID(substances.id

  • ecsを持っているすべてが化学物質のリストを

    1. substances:私は次のようにしている5つのテーブルを扱っています。
    2. cas - CAS番号*の値。
    3. ecs_substances - マッピングsubstances.id~ecs.idcas.idsubstances.idマッピング - 一substances.id一つまたは複数のecs.id
    4. cas_substancesにマッピングすることができます。一つsubstances.idは、これらの化学物質を分類するために使用される用語です* 1、または複数のcas.id

    にマッピングすることができます。

    データは1つの物質を探すことができる方法の例:複数のCAS番号の割り当ての

    substances.id | substances.name 
    -------------- | ---------------- 
    1    | FooBar 
    

    例(同じ原理は、ECのために適用されるが、単に簡潔にするためにCASを使用しています):

    cas_substances.id | substance_id 
    -------------------------------- 
    997    | 1 
    ----------------- | ------------ 
    23423    | 1 
    -------------------------------- 
    

    そして、CAS番号自身:

    cas.id | cas.value 
    ------ | --------- 
    997 | ABC-123 
    ------ | --------- 
    23423 | XYZ-876 
    ------------------ 
    

    希望の結果は、各substances.id, substances.nameのリストをCAS/EC番号の対応するリストで取得したいと考えています。理想的には改行でフォーマットされています。

    substances.id | substances.name | cas_values   | 
    -------------- | --------------- | ------------------ | 
    1    | FooBar   | ABC-123 "\n" XYZ-876 
    

    私は次のように論理があることがあることを理解:2から1(substances.id)から

    1. SELECT * FROM substances
    2. SELECT * FROM cas_substances WHERE cas_substances.substance_id =結果(S)
    3. SELECT cas.value FROM cas WHERE cas.cas.id =結果(単数または複数) (cas_substances.cas_id
    4. フォーマット事実を処理するためには、複数のレコードがある場合もあれば、複数ある場合もあります。cas_substances行 - レコード間に改行があります。

    を取得するSQLの記述方法がわかりません。1/2の結果です。

    これはMySQLでも可能ですか?私が構築しているアプリケーションはPHPで書かれていますが、SQLを使用するとPHPで複数のサブクエリを実行するよりはるかに高速になります(PHPで書ける方がはるかに簡単です)。

  • +1

    チェックGROUP_CONCAT()をし、それがSQL –

    答えて

    1

    これらの3つのテーブルを一緒に結合してから、group bygroup_concatを使用してこれを実現できます。

    select 
        `sub`.*, 
        group_concat(cas.`value` separator ' "\n" ') as cas_values 
    from substances `sub` 
    left join cas_substances cs on `sub`.id = cs.substance_id 
    left join cas on cas.id = cs.cas_id 
    group by `sub`.id 
    

    demoここに。

    注:GROUP_CONCATは、mysqlでのみ動作します。

    +0

    で問題ないはずですが、どうもありがとうございます、これは動作します。返されたデータの列名が 'group_concat(cas.'value' separator '" \ n "')なので、' group_concat() 'に別名を付けることは可能ですか?私はEC番号についても同じことをする必要があるので、後で参照するのを容易にするために、 'cas_values'と' ec_values'としてcolを使うことができます。 – Andy

    +0

    @Andyエイリアスが可能です。 – Blank

    0

    受け入れ答えの作品が、私はすべての5つのテーブル含めるために、これを拡大してきました:

    select 
    `sub`.*, 
    group_concat(cas.`value` separator ' "\n" ') as cas_values, 
    group_concat(ecs.`value` separator ' "\n" ') as ecs_values 
    from substances `sub` 
    left join cas_substances cs on `sub`.id = cs.substance_id 
    left join cas on cas.id = cs.cas_id 
    left join ecs_substances ec on `sub`.id = ec.substance_id 
    left join ecs on ecs.id = ec.ec_id 
    group by `sub`.id 
    
    関連する問題