2011-09-18 9 views
2

私はこの問題を抱えています。MySQLの連結問題

郵便番号付きのテーブルには、開始と終了という2つの列があります。まず、STARTとENDを選択して、それらを区切る必要があります。 〜と共に〜。 CONCAT_WSを使用してこれを行うことができますが、この連結文字列(複数の行があります)を1つの行に連結する必要もあります。

私はすでに、このクエリを持っている:(申し訳ありませんが、私はここにテーブルを挿入する方法がわからない)

row | user_id | postal range 
============================ 
1 | 1  | AAAA-BBBB 
---------------------------- 
2 | 1  | CCCC-DDDD 
---------------------------- 
3 | 1  | MMMM-NNNN 
---------------------------- 
4 | 2  | CCCC-DDDD 
---------------------------- 
5 | 2  | EEEE-FFFF 
---------------------------- 

とI:

SELECT pc.user_id, CONCAT_WS('-', pc.start, pc.end) FROM postal_codes pc, users u WHERE u.id=pc.user_id 

しかしsのあなたは、それは私がこのような結果与え期待

row | user_ID | postal_range 
---------------------------- 
1 | 1  | AAAA-BBBB, CCCC-DDDD, MMMM-NNNN 
---------------------------- 
2 | 2  | CCCC-DDDD, EEEE-FFFF 
---------------------------- 

複数の行を連結したい場合はGROUP_CONCATを使用できますが、このようなGROUP_CONCATに前のクエリのラップ結果:

SELECT pc.user_id, (GROUP_CONCAT((SELECT CONCAT_WS('-', pc.start, pc.end) FROM bs_postal_codes pc, bs_users u WHERE u.id=pc.user_id) SEPARATOR ', ')) FROM bs_postal_codes pc 

それは私にエラーを与える:サブクエリは複数行

を返し誰かが、これで私のおかげで手を与える場合、それは本当に私を助けるだろう。

+0

これはそれでよいが、SQLiteのではない可能性があります私は列名として 'end'を使うことに問題がありました。 – Francisc

+0

良い最初の質問。私はあなたが本当にそのユーザー名を維持したいのだろうかと思います。 –

答えて

2

GROUP_CONCATは、すべての集約関数として、それらが含まれるクエリ(外部クエリ)内で機能します。複数の行を戻すパラメーターとしてSELECTステートメントを追加することはできません。

これを試してみてください。

SELECT 
    pc.user_id, 
    GROUP_CONCAT(CONCAT_WS('-', pc.start, pc.end) SEPARATOR ', ') as codes 
FROM 
    bs_postal_codes pc 
GROUP BY 
    pc.user_id 

追加(コメントを参照してください):

1.

SELECT 
    u.id, 
    /* Optional other user fields. Add them to Group By too, */ 
    GROUP_CONCAT(CONCAT_WS('-', pc.start, pc.end) SEPARATOR ', ') as codes 
FROM 
    users u 
    LEFT JOIN bs_postal_codes pc ON pc.user_id = u.id 
GROUP BY 
    u.id 

2.

SELECT 
    u.id, 
    /* Optional other user fields. Add them to Group By too, */ 
    (SELECT 
    GROUP_CONCAT(CONCAT_WS('-', pc.start, pc.end) SEPARATOR ', ') 
    FROM 
    bs_postal_codes pc 
    WHERE 
    pc.user_id = u.id) as codes 
FROM 
    users u 
+0

ありがとう、私はあなたを愛しています! –

+0

ご迷惑をおかけして申し訳ありませんが、郵便番号が割り当てられていないユーザーを追加するにはどうすればよいですか? –

+0

'users'を運転テーブルとして使用して、郵便番号を残しておくことができます。第2の解決策は、副選択において郵便番号のリスト全体を選択することである。この場合、グループを必要としないことに注意してください。私は両方のソリューションを答えに加えました。どちらが最適かをチェックしてください(パフォーマンスもチェックしてください)。 – GolezTrol