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;
Janが のコメントで述べたように、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 |
+------------+--------------------+-------+
それから、あなたはチェックボックスとしてこれらの子犬をリストにしている若干の空想的 - シュマンシーなajaxを持っています。
空腹のカバユーザーは13, 15, 16
を選択します。今日の彼女のデザートはありません...
純粋なmysqlを使って、ユーザーの注文を一行にまとめる方法。
GROUP_CONCAT
を the 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 |
+------------------------------------------------+-------+
シモンズ: In-N-Out 近くにない場合は謝罪...
GROUP_CONCAT
パラメーターを設定することで、group_concat_max_len
値の最大長を変更できます。
詳細は MySQLのドキュメント を参照してください。
GROUP集約関数、 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