2016-11-13 13 views
0

私はエンジニアやテーブルは、私は、次のSQLを使用する場合、私はエンジニアやグループ、連結ステートメントを使用して、それらに関連した郵便番号のリストを取得するが、私はできませんMYSQL複数のグループの連結方式

Post_Codesと呼ばれるテーブルと呼ばれるしましたHi Secondary_Engineer_idフィールドを介して同じエンジニアにリンクされたポストコードをSecondary_Post_Codes_Assignedという別のフィールドにリストする(実際に必要な場合)別のグループConcatにも含める方法を見つけます。

SELECT 
    Engineer.Engineer,GROUP_CONCAT(Post_Code SEPARATOR ', ') as Post_Codes_Assigned, 
    Engineer.Region, 
    Engineer.active, 
    Engineer.Engineer_id 
FROM Engineer INNER JOIN Post_Code ON Engineer.Engineer_id = Post_Code.Engineer_id 
GROUP BY Engineer_id 

これと同様の出力が必要です。

Engineer_id | Post_Codes_Assigned | Secondary_Post_Codes_Assigned 


---------- 
1   | AW, AW3    | B12       | 
2   | B12     | AW, CV12      |     

私はmysqlのかなり新しいです。

よろしく アラン

+1

現在のクエリにはいくつかの問題があります。サンプルデータを表示できますか? –

+0

@Tim Biegeleisen:いくつかの問題?どちら?あなたは 'GROUP BY Engineer_id'の欠けている修飾子を参照していますか?私は他の人が見えないことを認めなければならない。 –

+0

一般に、プレゼンテーション層にデータ表示の問題を処理する方が良いです。 – Strawberry

答えて

0

あなたはすでに今、二次のものと同じ操作を行い、主要ポストコードに参加し、それらをリストアップしています。

SELECT 
    e.Engineer, 
    GROUP_CONCAT(DISTINCT pc1.Post_Code) AS Primary_Post_Codes_Assigned, 
    GROUP_CONCAT(DISTINCT pc2.Post_Code) AS Secondary_Post_Codes_Assigned, 
    e.Region, 
    e.active, 
    e.Engineer_id 
FROM Engineer e 
JOIN Post_Code pc1 ON e.Engineer_id = pc1.Engineer_id 
JOIN Post_Code pc2 ON e.Engineer_id = pc2.Secondary_Engineer_id 
GROUP BY e.Engineer_id; 

ご覧のとおり、すべてのプライマリおよびセカンダリのすべての郵便番号を選択するとき、あなたは中間結果でそれらのすべての組み合わせの行を取得しているので、あなたはDISTINCTを必要としています。だから、重複をなくす必要があります。このため、参加する前に集計する方が良いです。 (あなたはどちら集計で作業する場合、この習慣にしたいことがありので、私は一般的に、良いアイデアを検討してください。)

SELECT 
    e.Engineer, 
    pc1.Post_Codes AS Primary_Post_Codes_Assigned, 
    pc2.Post_Codes AS Secondary_Post_Codes_Assigned, 
    e.Region, 
    e.active, 
    e.Engineer_id 
FROM Engineer e 
JOIN 
(
    SELECT Engineer_id, GROUP_CONCAT(Post_Code) AS Post_Codes 
    FROM Post_Code 
    GROUP BY Engineer_id 
) pc1 ON e.Engineer_id = pc1.Engineer_id 
JOIN 
(
    SELECT Secondary_Engineer_id, GROUP_CONCAT(Post_Code) AS Post_Codes 
    FROM Post_Code 
    GROUP BY Secondary_Engineer_id 
) pc2 ON e.Engineer_id = pc2.Secondary_Engineer_id; 

第三の選択肢はSELECT句でサブクエリだろう。私は通常、図のようにFROM節にあることを好みます。SELECT節では不可能な列をサブクエリに追加するのは簡単です。

SELECT 
    e.Engineer, 
    (
    SELECT GROUP_CONCAT(pc1.Post_Code) 
    FROM Post_Code pc1 
    WHERE pc1.Engineer_id = e.Engineer_id 
) AS Primary_Post_Codes_Assigned, 
    (
    SELECT GROUP_CONCAT(pc2.Post_Code) 
    FROM Post_Code pc2 
    WHERE pc2.Secondary_Engineer_id = e.Engineer_id 
) AS Secondary_Post_Codes_Assigned, 
    e.Region, 
    e.active, 
    e.Engineer_id 
FROM Engineer e; 
+0

ありがとうございます。 –