複数のMySQL行を1つのフィールドに連結できますか?
-
07-07-2019 - |
質問
MySQL
を使用すると、次のようなことができます。
SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;
マイ出力:
shopping
fishing
coding
しかし、代わりに1行、1列が必要です:
期待される出力:
shopping, fishing, coding
理由は、複数のテーブルから複数の値を選択しているため、すべての結合の後、必要以上の行ができているためです。
で関数を探しました。 MySQL Doc で、 CONCAT
または CONCAT_WS
関数が結果セットを受け入れるように見えないので、ここで誰かがこれを行う方法を知っていますか?
解決
SELECT person_id, GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
Ludwigが彼のコメントで述べたように、重複を避けるために DISTINCT
演算子を追加できます:
SELECT person_id, GROUP_CONCAT(DISTINCT hobbies SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
1月にコメントで述べたように、コメントa> ORDER BY
:
SELECT person_id, GROUP_CONCAT(hobbies ORDER BY hobbies ASC SEPARATOR ', ')
FROM peoples_hobbies
GROUP BY person_id;
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
);
他のヒント
MySQLバージョン(4.1)でサポートされている場合は、 GROUP_CONCAT
をご覧ください。詳細については、ドキュメントをご覧ください。詳細。
次のようになります:
SELECT GROUP_CONCAT(hobbies SEPARATOR ', ')
FROM peoples_hobbies
WHERE person_id = 5
GROUP BY 'all';
複数の個別の行を連結する代替構文
警告:この投稿はお腹をすかせます。
指定:
グループではなく、複数の個別の行を選択—特定のフィールドで連結したいことがわかりました。
商品IDとその名前と価格の表があるとします:
+------------+--------------------+-------+
| product_id | name | price |
+------------+--------------------+-------+
| 13 | Double Double | 5 |
| 14 | Neapolitan Shake | 2 |
| 15 | Animal Style Fries | 3 |
| 16 | Root Beer | 2 |
| 17 | Lame T-Shirt | 15 |
+------------+--------------------+-------+
次に、これらの子犬をチェックボックスとして一覧表示する派手なアジャックスがあります。
空腹のカバユーザーが 13、15、16
を選択します。今日は彼女のデザートはありません...
検索:
純粋なmysqlを使用して、ユーザーの注文を1行で要約する方法。
解決策:
GROUP_CONCAT
を IN
句:
mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary FROM product WHERE product_id IN (13, 15, 16);
出力:
+------------------------------------------------+
| order_summary |
+------------------------------------------------+
| Double Double + Animal Style Fries + Root Beer |
+------------------------------------------------+
ボーナスソリューション:
合計価格も必要な場合は、 SUM()
:
mysql> SELECT GROUP_CONCAT(name SEPARATOR ' + ') AS order_summary, SUM(price) AS total FROM product WHERE product_id IN (13, 15, 16);
+------------------------------------------------+-------+
| order_summary | total |
+------------------------------------------------+-------+
| Double Double + Animal Style Fries + Root Beer | 10 |
+------------------------------------------------+-------+
PS: In-N-Out が近くにない場合はおApび申し上げます。 。
group_concat_max_len
パラメーターを設定することにより、 GROUP_CONCAT
値の最大長を変更できます。
GROUP Aggregate関数があります、 GROUP_CONCAT 。
私の場合、Idの行があり、それをcharにキャストする必要がありました。それ以外の場合、結果はバイナリ形式にエンコードされました:
SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table
次のようなMySQL(5.6.13)セッション変数と代入演算子を使用します
SELECT @logmsg := CONCAT_ws(',',@logmsg,items) FROM temp_SplitFields a;
その後、取得できます
test1,test11
より複雑なクエリがあり、それを機能させるには、外部クエリで GROUP_CONCAT
を使用する必要があることがわかりました。
元のクエリ:
SELECT DISTINCT userID
FROM event GROUP BY userID
HAVING count(distinct(cohort))=2);
実装:
SELECT GROUP_CONCAT(sub.userID SEPARATOR ', ')
FROM (SELECT DISTINCT userID FROM event
GROUP BY userID HAVING count(distinct(cohort))=2) as sub;
これが誰かの助けになることを願っています。
これを試してください:
DECLARE @Hobbies NVARCHAR(200) = ' '
SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;
サブクエリで GROUP_CONCAT
を使用する方法をここで見ている人のために-この例を投稿してください
SELECT i.*,
(SELECT GROUP_CONCAT(userid) FROM favourites f WHERE f.itemid = i.id) AS idlist
FROM items i
WHERE i.id = $someid
したがって、 GROUP_CONCAT
は、サブクエリ内ではなく、サブクエリ内で使用する必要があります。
MySqlで列を連結するには2つの方法があります
select concat(hobbies) as `Hobbies` from people_hobbies where 1
または
select group_concat(hobbies) as `Hobbies` from people_hobbies where 1