質問

MySQL を使用すると、次のようなことができます。

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

マイ出力:

shopping
fishing
coding

しかし、代わりに1行、1列が必要です:

期待される出力:

shopping, fishing, coding

理由は、複数のテーブルから複数の値を選択しているため、すべての結合の後、必要以上の行ができているためです。

で関数を探しました。 MySQL Doc で、 CONCAT または CONCAT_WS 関数が結果セットを受け入れるように見えないので、ここで誰かがこれを行う方法を知っていますか?

役に立ちましたか?

解決

を使用できますGROUP_CONCAT

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月にコメントで述べたように、 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 値の最大長を変更できます。

MySQLドキュメントで詳細を参照してください。

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
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top