web-dev-qa-db-ja.com

1つの列の複数の行から複数​​の列を選択する(サブクエリ?)

MySQL 5.1.68を使用しています。

別のテーブルから列に行を選択したい状況があります。

enter image description here

これを出力したい:


id#name#citizen_name(複数の市民名)

1#ハーグ#バラク・オバマ、マーク・ザッカーバーグ、ジョージ・ブッシュ


複数のクエリでこれを行う方法を知っていますが、1つのクエリだけでこれを実行したいと思います。私はgroup_concatとconcat_wsを調べてきましたが、残念ながら、これは私が探していた結果をぼんやりさせていません。また、SELECTサブクエリの結果を変数に入れてそれらの結果をCONCATしようとしましたが、それも機能しませんでした。

スキーマといくつかのテストデータを表示する私のSQLフィドル: http://sqlfiddle.com/#!2/c7c7e/1

私に何ができる?

3
Ivo van Beek

GROUP_CONCAT を使用して、市民名を最初に集計する必要があります。次に [〜#〜] concat [〜#〜] を使用します

SELECT CONCAT(id,' # ',name,' # ',citizens) listing FROM
(
    SELECT A.id,A.name,GROUP_CONCAT(B.name,' ',B.surname) citizens
    FROM city A INNER JOIN citizen B
    ON A.id = B.city_id GROUP BY A.id,A.name
) AA;

ここにSQL Fiddleそれを証明するために: http://sqlfiddle.com/#!2/9f4b3/1

切り捨てが原因で名前が長くなりすぎる場合は、 GROUP_CONCAT の最大長を拡張する必要があります。これを16Kに設定するには、次のコマンドを実行します。

SET group_concat_max_len = 1024 * 16;
SET GLOBAL group_concat_max_len = 1024 * 16;

1行目はセッション用、2行目はすべての新しいDB接続用です。

2
RolandoMySQLDBA