複数カラム - mysql 重複 抽出 複数




1つのフィールドに複数のMySQL行を連結できますか? (6)

複数の個々の行を連結する代替構文

警告:この投稿はあなたに空腹をさせるでしょう。

与えられた:

グループの代わりに複数の個別の行選択して、特定のフィールドを連結したいと思っていました。

商品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行にまとめる方法。

溶液:

IN句で GROUP_CONCATを使用します。

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がないとお詫びします...

MySQLを使って、私は次のようにすることができます:

SELECT hobbies FROM peoples_hobbies WHERE person_id = 5;

私の出力:

shopping
fishing
coding

代わりに私はちょうど1行、1 col:

期待される成果:

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演算子を追加することができ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
);

group_concat_max_lenパラメータを設定すると、 GROUP_CONCAT値の最大長を変更できます。

詳細はGROUP_CONCATを参照してください。


これを試して:

DECLARE @Hobbies NVARCHAR(200) = ' '

SELECT @Hobbies = @Hobbies + hobbies + ',' FROM peoples_hobbies WHERE person_id = 5;

私の場合はId列があり、それをcharにキャストする必要がありました。そうでなければ、結果はバイナリ形式にエンコードされました。

SELECT CAST(GROUP_CONCAT(field SEPARATOR ',') AS CHAR) FROM table




group-concat