2016-07-13 15 views
1

私は、一意のIDを持つ1つのメインテーブルと、異なる選択肢をリストしたテーブルが少数です(項目を説明する1つのidカラムと1つのテキストカラムを持つ)。したがって、メインテーブルの1つのレコードに対して、選択テーブルに複数の選択肢を関連付けることができます。
GROUP_CONCATを使用して、特定の「選択」テーブルとは異なる選択肢を1つのフィールドに連結するために、すべての情報を表示できるビューを作成したいとします。しかし、私のクエリは、レコードが別の「選択」テーブルの他の複数の選択肢に関連している場合、選択肢の各リストを何度も繰り返します。クエリが...ここ
をこれらの選択肢の間のすべての可能な組み合わせを返す私のクエリ(2チョイス "のテーブルに縮小-t_age、例えばt_animal-)
サブクエリでGROUP_CONCATとJOINを使用する

SELECT general.id_g, 
    GROUP_CONCAT(CAST(t_age AS CHAR) SEPARATOR ', ') AS age, 
    GROUP_CONCAT(CAST(t_animal AS CHAR) SEPARATOR ', ') AS animal 
FROM general 
LEFT JOIN interm_age 
    INNER JOIN t_age ON interm_age.id_age = t_age.id_age 
ON general.id_g = interm_age.id_g 
LEFT JOIN interm_animal 
    INNER JOIN t_animal ON interm_animal.id_animal = t_animal.id_animal 
ON general.id_g = interm_animal.id_g 
GROUP BY id_g; 

は、私は/各CONCATを含めることを試みましたサブクエリ内のJOINをメインのSELECTに渡しますが、MySQLは「1以上の値を返します」というメッセージが表示されます。そして?

SELECT id_g, (
    SELECT GROUP_CONCAT(CAST(t_age AS CHAR) SEPARATOR ', ') 
    FROM general 
    LEFT JOIN interm_age 
    INNER JOIN t_age ON interm_age.id_age = t_age.id_age 
    ON general.id_g = interm_age.id_g 
    GROUP BY general.id_g ) 
FROM general; 


[EDIT]より詳細に 、これは(FKで)私のDBである

一般
-----------

id_g | date 
902 | 2016/01/01 
956 | 2016/02/01 
959 | 2016/02/01 


interm_age
-------- ---

id_age | id_g 
1  |  902 
3  |  902 
1  |  956 
4  |  956 


interm_animal
-----------

id_animal |  id_g 
1   |  902 
5   |  902 
5   |  959 
7   |  959 


T_AGE
---------- -

id_age |  age 
1  |  <10y 
3  |  >10y 
4  |  >60y 


t_animal
-----------

id_animal | animal 
1   | bird 
5   |  mammal 
7   |  insect 


そして、私のようなものたいと思います:

id_g | date  | age  | animal 
902 | 2016/01/01 | <10y, >10y | bird, mammal 

などを.. 。

ありがとうございます!

答えて

0

サンプルデータ、実際の結果、および予想される結果を提供した方が良いでしょうが、私はその解決策に刺すようです。

おそらく、結合されたテーブルに複数の一致するレコードがあり、group_concat()内の値が重複している可能性があります。DISTINCT句を使用し、重複値を排除するために

group_concat()上でMySQLのドキュメントとして

は、あなたが重複する値を削除するには明確なキーワードを使用することができ、示します。

SELECT general.id_g, 
    GROUP_CONCAT(DISTINCT CAST(t_age AS CHAR) SEPARATOR ', ') AS age, 
    GROUP_CONCAT(DISTINCT CAST(t_animal AS CHAR) SEPARATOR ', ') AS animal 
FROM general 
LEFT JOIN interm_age 
    INNER JOIN t_age ON interm_age.id_age = t_age.id_age 
ON general.id_g = interm_age.id_g 
LEFT JOIN interm_animal 
    INNER JOIN t_animal ON interm_animal.id_animal = t_animal.id_animal 
ON general.id_g = interm_animal.id_g 
GROUP BY id_g; 
+0

迅速な返信をありがとうございます。残念ながら、DISTINCTを追加しても役に立ちません。詳細を表示するために質問を編集しました。 – RemiC

+0

distinctキーワードを使用するとどのような出力が得られますか? – Shadow

+0

"サブクエリが1行以上を返します"。したがって、DISTINCTがない場合と同じエラーです。私はSELECT内のサブクエリに似た問題を抱えていましたが、UNIONを条件としてたくさんのクエリを使用して解決しました。しかし、ここでは、私は満たすための条件がありません。 – RemiC

0

この

SELECT general.id_g, 
    GROUP_CONCAT(CAST(t_age AS CHAR) SEPARATOR ', ') AS age, 
    GROUP_CONCAT(CAST(t_animal AS CHAR) SEPARATOR ', ') AS animal 
FROM general 
LEFT JOIN interm_age 
    INNER JOIN t_age ON interm_age.id_age = t_age.id_age AND general.id_g = interm_age.id_g 
LEFT JOIN interm_animal 
    INNER JOIN t_animal ON interm_animal.id_animal = t_animal.id_animal AND general.id_g = interm_animal.id_g 
GROUP BY id_g; 

を試してみて、これがお役に立てば幸いです。

+0

ありがとうございますが、どちらも動作しません。 2番目のONは最初のJOINの節を述べることでした。クエリのこの部分はこれまでのところ仕事をしていることに注意してください。あるいは、同じことをしているように見えるので、私は2つの分離したLEFT JOINを書くことができました。 – RemiC

関連する問題