MySQL`を使って、次のようなことができます。
SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;
私の出力:
shopping
fishing
coding
となりますが、代わりに1行1列にしたいと思います。
**期待される出力:***。
shopping, fishing, coding
理由は、複数のテーブルから複数の値を選択していて、すべての結合の後に、希望するよりも多くの行を持っているからです。
href="http://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_concat-ws">MySQL Docで関数を探してみましたが、CONCAT
やCONCAT_WS
では結果セットを受け付けることができないようなので、どなたかこの方法をご存知でしょうか?
GROUP_CONCAT`]group-concatを使うことができます。
SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
Ludwig氏のコメント][ludwig]にあるように、重複を避けるためにDISTINCT
演算子を追加することができます。
SELECT person_id, GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
Jan氏が彼らのコメントで述べているように、ORDER BY
を使ってインポートする前に値をソートすることもできます。
SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
Dag氏が[彼のコメント][dag]で述べているように、結果には1024バイトの制限があります。これを解決するには、あなたのクエリの前にこのクエリを実行します。
SET group_concat_max_len = 2048;
もちろん、必要に応じて 2048
を変更することができます。値を計算して割り当てるには
SET group_concat_max_len = CAST(
(SELECT SUM(LENGTH(hobbies)) + COUNT(*) * LENGTH(', ')
FROM peoples_hobbies
GROUP BY person_id)
AS UNSIGNED
);
[ダグ]: https://stackoverflow.com/questions/276927/can-i-concatenate-multiple-mysql-rows-into-one-field/276949#comment12638055_276949 [ルドウィグ】: https://stackoverflow.com/questions/276927/can-i-concatenate-multiple-mysql-rows-into-one-field#comment14513101_276949