MySQL GROUP_CONCAT 個数を指定

このQ&Aのポイント
  • MySQLのGROUP_CONCAT関数を使用してデータをまとめることはできますが、個数を指定することはできません。
  • データ個数を指定するか、最大値に合わせる方法はありません。
  • 他の手法を使用する必要があります。
回答を見る
  • ベストアンサー

MySQL GROUP_CONCAT 個数を指定

DBに以下のようなデータが格納されているとします。 | id | name | | 01 | apple | | 01 | banana | | 02 | onion | | 02 | potato | | 02 | carrot | | 02 | radish | | 03 | beef | | 03 | chicken | | 03 | pork | GROUP_CONCATという関数を使えば、 | id | name | | 01 | apple,banana | | 02 | onion,potato,carrot,radish | | 03 | beef,chicken,pork | と、まとめられることは分かっているのですが、 データ個数を指定または最大値に合わせることは可能でしょうか。 実現したい例を以下に記載します。 | id | name | | 01 | apple,banana,NULL,NULL, | | 02 | onion,potato,carrot,radish | | 03 | beef,chicken,pork,NULL | ※「id:02」の最大値「4データ」に合わせるまたは「4」を指定する GROUP_CONCATの引数にはこのような機能はないように見受けられました。 他の手法でも構わないのですがこのような内容を実現できる方法がありましたら ご教授頂ければ幸いです。 どうぞよろしくお願いします。

  • MySQL
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

かなり強引ですがこんな感じ? //元データ create table hoge (id int,name varchar(20)); insert hoge values(1,'apple'),(1,'banana'),(2,'onion'),(2,'potato'),(2,'carrot'),(2,'radish'),(3,'beef'),(3,'chicken'),(3,'pork'); //集計 select id ,concat(group_concat(name) ,repeat(',NULL',(select max(c) from (select id,count(name) as c from hoge group by id) as sub)-count(name))) as name from hoge group by id; そもそも「NULL」を文字列として使用していいのか怪しいところ また例題のNULLの後ろにカンマがあったりなかったりブレがあるのが気になる ロジック的には、nameの最大件数を拾って、自分の件数との差だけ「,NULL」という 文字をつなげる・・・みたいなかんじ、 ただし思いつきを冗長にかいただけなのでもっと有効な方法があると思います

tokyor
質問者

お礼

お礼が遅れすみません。 こちらの方法をすこし改変して無事実現出来ました。 ありがとうございました。

関連するQ&A

  • MySQL この場合どう書けばよいでしょうか?

    以下のようなデータがあります。 このデータから最後の「結果」のような形でデータを取り出したい場合、どのようにすればよいでしょうか? cat1とcat2を分けない形はgroup_concatを使ってできたのですが、カテゴリーごとに分けて取得したいです。 usr テーブル +--------+------+ | usr_id | name | +--------+------+ | 1 | 太郎 | | 2 | 二郎 | | 3 | 花子 | +--------+------+ usr_trm テーブル +--------+--------+ | usr_id | trm_id | +--------+--------+ | 1 | 1 | | 1 | 3 | | 1 | 4 | | 2 | 1 | | 2 | 2 | | 2 | 3 | | 3 | 2 | +--------+--------+ cat テーブル +--------+------+ | cat_id | name | +--------+------+ | 1 | 性別 | | 2 | 部署 | +--------+------+ trm テーブル +--------+--------+------+ | trm_id | cat_id | name | +--------+--------+------+ | 1 | 1 | 男性 | | 2 | 1 | 女性 | | 3 | 2 | 総務 | | 4 | 2 | 経理 | +--------+--------+------+ 結果 +--------+------+------+------+ | usr_id | name | cat1 | cat2 | +--------+------+------+------+ | 1 | 太郎 | 1 | 3,4 | | 2 | 二郎 | 1,2 | 3 | | 3 | 花子 | 2 |   | +--------+------+----- +------+

    • ベストアンサー
    • MySQL
  • MySQL 条件での絞込みがうまくいきません

    下記の質問をさせていただき、解決いたしましたが、それに関連して新たなご質問です。 http://okwave.jp/qa/q8830319.html 上記質問内容は、 以下のようなデータから、「結果」のような形でデータを取り出したいというもので、「いただいたご回答」の形で一旦解決しました。 usr テーブル +--------+------+ | usr_id | name | +--------+------+ | 1 | 太郎 | | 2 | 二郎 | | 3 | 花子 | +--------+------+ usr_trm テーブル +--------+--------+ | usr_id | trm_id | +--------+--------+ | 1 | 1 | | 1 | 3 | | 1 | 4 | | 2 | 1 | | 2 | 2 | | 2 | 3 | | 3 | 2 | +--------+--------+ cat テーブル +--------+------+ | cat_id | name | +--------+------+ | 1 | 性別 | | 2 | 部署 | +--------+------+ trm テーブル +--------+--------+------+ | trm_id | cat_id | name | +--------+--------+------+ | 1 | 1 | 男性 | | 2 | 1 | 女性 | | 3 | 2 | 総務 | | 4 | 2 | 経理 | +--------+--------+------+ 結果 +--------+------+------+------+ | usr_id | name | cat1 | cat2 | +--------+------+------+------+ | 1 | 太郎 | 1 | 3,4 | | 2 | 二郎 | 1,2 | 3 | | 3 | 花子 | 2 |   | +--------+------+----- +------+ いただいたご回答 select t1.usr_id,t3.name ,group_concat(if(cat_id=1,t1.trm_id,null)) as cat1 ,group_concat(if(cat_id=2,t1.trm_id,null)) as cat2 from usr_trm as t1 inner join trm as t2 on t1.trm_id=t2.trm_id inner join usr as t3 on t1.usr_id=t3.usr_id group by usr_id さらにそこから、例えば「総務に所属する人をランダムにn件」という形で絞り込もうと思い、 WHERE t2.trm_id=3 と ORDER BY RAND() LIMIT 10 を追加したところ、条件通り抽出はされるのですが、結果の「cat1」「cat2」に他のカテゴリーの値が入らなくなりました。 WHERE t2.trm_id=3 を消すと「cat1」と「cat2」に値が入ってきます。 「cat1」と「cat2」に全ての値が入った状態で絞込をするために、どのようにすればよいかわかりません。 アドバイスをいただけると幸いです。

    • ベストアンサー
    • MySQL
  • 複数のオブジェクトと生成とその組み合わせ

    外部からの入力で複数のオブジェクトを生成し、それらの可能な組み合わせをつくる方法でつまずいています。 例えば class mochimono { public: string name; int weight int maximum_number; }; というクラスを設定します。生成されるオブジェクトには名前と重さのほか”最大何個まで持ちうるか(設定できるか)”というパラメータがあります。 たとえば最大2つまでもてるのApple、最大1つまで持てるBananaという2つのオブジェクトをつくると name:Apple weight:2 maximum_number:2 name:Banana weight:3 maximum_number:1 ありうる組み合わせは Apple x 0, Banana x 0 Apple x 0, Banana x 1 Apple x 1, Banana x 0 Apple x 1, Banana x 1 Apple x 2, Banana x 0 Apple x 2, Banana x 1 となります。 この組み合わせを、例えば最後の組み合わせであれば”Apple, Apple, Banana"というオブジェクトのベクター”としてつくり、全体を”オブジェクトのベクターのベクター”として管理し、その後別の処理を行いたいと思っています。 ですが、オブジェクトが複数種類作られることを想定してこの組み合わせを”オブジェクトのベクターのベクター”として実現するアルゴリズムが作成できずに困っています。 アルゴリズム自体が思いつかず、抽象的で分かりずらいかもしれませんが、解決策があればよろしくお願いします。

  • Index の使い方、where a.カラム1 LIKE CONCAT

    Index の使い方、where a.カラム1 LIKE CONCAT(b.カラム2,'%') お世話になります。 テーブルA: id phone ----------------------------------- 1 819011112222 2 819022223333 3 81312345678 4 651112222 5 8699998888 6 819011112222 テーブルB: id Name Pref --------------------------------------------------- 1 Japan-1 8131234 2 JP-Mobile 8190 3 China-1 869 4 China-2 868 5 Japan-2 813 6 Japan 81 7 Singapore 65 このようなテーブルで、テーブルBはレコード数が数千件あります。 数千件でしたし、データを取るのに遅いとは思いますが、 なんとか耐えらえた範囲なので下記のように実行しておりました。 select a.*,b.Name,b.Pref FROM テーブルA a, テーブルB b where a.phone LIKE CONCAT(Pref,'%') group by a.id; 結果 id phone Name ---------------------------------------------------- 1 819011112222 JP-Mobile 2 819022223333 JP-Mobile 3 81312345678 Japan-2 4 651112222 Singapore 5 8699998888 China-1 5 862223333 China-2 6 819011112222 JP-Mobile テーブルB Prefに対してIndexを作成していますが、どうも作動していないようです。 Indexに関してよく理解できていなかったので、気にしていなかったのですが、今回早さを比べる為に Indexあり、なしで試しみても大して変っていませんでした。 今のところ、Indexを使えていなくても問題ないのですが、今後テーブルBのデータが数万件に増えてしまい、今までのやり方が通用しません。 効果的に使用する方法をアドバイス頂けませんでしょうか。 よろしくお願いします。

  • mysqlのインデックスについて質問です。

    mysqlのインデックスについて質問です。 http://archiva.jp/web/server-side/sql_02.html に、 『mysqlでは1つのクエリ実行で、1つのテーブルにつき1つのインデックスしか使用できない』 とあります。 よく以下のようなテーブル定義を見かけますが、 CREATE TABLE IF NOT EXISTS `data` ( `id` int(10) NOT NULL default '0', `user_id` int(10) NOT NULL default '0', `file_id` int(10) NOT NULL default '0', `name` text collate utf8_unicode_ci NOT NULL default '', PRIMARY KEY (`id`), KEY `user_id` (`user_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; idとuser_idを条件にするクエリであれば、上記制約を満たすため、 KEY `id_user_id_idx` (`id`,`user_id`) の複合クエリを定義すれば良いのでしょうか? また、idとuser_idとfile_idを条件にするクエリも考慮に入れた場合、 テーブル定義は以下のようにするのでしょうか? CREATE TABLE IF NOT EXISTS `data` ( `id` int(10) NOT NULL default '0', `user_id` int(10) NOT NULL default '0', `file_id` int(10) NOT NULL default '0', `name` text collate utf8_unicode_ci NOT NULL default '', PRIMARY KEY (`id`), KEY `user_id` (`user_id`), KEY `id_user_id_idx` (`id`,`user_id`), KEY `id_user_id_file_id_idx` (`id`,`user_id`,`file_id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; 最後に、create table 時のインデックスの指定は、 INDEX `user_id` (`user_id`), のようにもできますが、INDEXとKEYの違いは何かあるのでしょうか。

    • ベストアンサー
    • MySQL
  • ID番号を指定して、行にデータを追加する方法は?

    +------+----------+----------------+----------+ | id | name | address | hobby | +------+----------+----------------+----------+ | 1 | 武田信玄 | 山梨県甲府市 | NULL | | 2 | 毛利元就 | 広島県広島市 | NULL | +------+----------+----------------+----------+ というテーブルがあります。 カラムhobby[int型]にデータを追加するため、 mysql> insert into BUSHOU(hobby) values('2'),('1'); とすると、 +------+----------+----------------+----------+ | id | name | address | hobby | +------+----------+----------------+----------+ | 1 | 武田信玄 | 山梨県甲府市 | NULL | | 2 | 毛利元就 | 広島県広島市 | NULL | | NULL | NULL | NULL | 2 | | NULL | NULL | NULL | 1 | +------+----------+----------------+----------+ となってしまいます。 mysql> insert into BUSHO(hobby) where id 1 values('2'); とするとsyntaxエラーになります。 カラムhobby[int型]にデータを追加するためには、どうすれば良いのでしょうか?

    • ベストアンサー
    • MySQL
  • MySQLでのランキングを作成するSQL

    ランキングを作成する、効率の良いSQLを教えて下さい。 MySQLで、以下の状態です。 テーブル名: hoge カラム: id,kbn,name,score,flg,date id…自動 kbn…1~4 name…string score…int flg…bool date…年月日 (1)dateが1週間以内のデータのみ (2)flgがtrueのデータのみ (3)kbn毎に、5レコード取得 (4)順位は、点数が重複している場合は同一の順位をつけSQLで生成しn位のフォーマット (5)6レコード以降に同一スコアのデータがある場合は日付が古い順 (6)scoreは、n点のフォーマット (7)該当データが5レコード存在しなかった場合は、順位だけをセットし他をnull 欲しい結果は、以下の状態です。 kbn,順位,name,score 1 ,1位 ,ホゲ,100点 1 ,2位 ,あい, 85点 1 ,2位 ,かき, 85点 1 ,4位 ,くけ, 70点 1 ,5位 ,さし, 65点 2 ,1位 ,すせ, 99点 2 ,1位 ,たち, 99点 2 ,3位 ,つて, 80点   ・   ・   ・ 4 ,4位 ,らり, 10点 null ,5位 ,null, null 以上、よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • ラジオボタンによる内容の振り分け

    お世話になります。 他の方が作ったファイルを修正しないといけなくなり、本当に悩んでます…。お願いします。教えてください。 ラジオボタンによるフォームの振り分けをさせたいと思っています。 [HTMLファイル(fruit.html)] まずラジオボタンが以下のようになっています。 <input name="種類" type="radio" value="アップル" onclick="jobShow('apple');jobHide('banana');jobHide('peach');jobHide('berry');jobHide('grape');jobHide('lemon');jobHide('melon');jobHide('orange');" id="item1" checked="checked" />アップル <input name="種類" type="radio" value="バナナ" onclick="jobHide('apple');jobShow('banana');jobHide('peach');jobHide('berry');jobHide('grape');jobHide('lemon');jobHide('melon');jobHide('orange');" id="item2" />バナナ <input name="種類" type="radio" value="ピーチ" onclick="jobHide('apple');jobHide('banana');jobShow('peach');jobHide('berry');jobHide('grape');jobHide('lemon');jobHide('melon');jobHide('orange');" id="item3" />ピーチ <input name="種類" type="radio" value="ベリー" onclick="jobHide('apple');jobHide('banana');jobHide('peach');jobShow('berry');jobHide('grape');jobHide('lemon');jobHide('melon');jobHide('orange');" id="item4" />ベリー <input name="種類" type="radio" value="グレープ" onclick="jobHide('apple');jobHide('banana');jobHide('peach');jobHide('berry');jobShow('grape');jobHide('lemon');jobHide('melon');jobHide('orange');" id="item5" />グレープ <input name="種類" type="radio" value="レモン" onclick="jobHide('apple');jobHide('banana');jobHide('peach');jobHide('berry');jobHide('grape');jobShow('lemon');jobHide('melon');jobHide('orange');" id="item6" />レモン <input name="種類" type="radio" value="メロン" onclick="jobHide('apple');jobHide('banana');jobHide('peach');jobHide('berry');jobHide('grape');jobHide('lemon');jobShow('melon');jobHide('orange');" id="item7" />メロン <input name="種類" type="radio" value="オレンジ" onclick="jobHide('apple');jobHide('banana');jobHide('peach');jobHide('berry');jobHide('grape');jobHide('lemon');jobHide('melon');jobShow('orange');" id="item8" />オレンジ そしてその下にそれぞれの項目のフォームがすべて並べてあります。 <h4>アップル</h4> <table width="576" border="0" cellspacing="1" cellpadding="0" class="common-table"> <tr> <th width="20%">商品名</th> <td><select name="商品名1" id="apple1"> <option value="">商品をお選びください</option> <option value="アップル1">アップル1</option> <option value="アップル2">アップル2</option> </select></td> </tr> <tr> <th>個数</th> <td><input name="個数1" type="text" size="5" id="apple2" />個</td> </tr> </table> </div> <div id="banana"> <h4>バナナ</h4> <table width="576" border="0" cellspacing="1" cellpadding="0" class="common-table"> <tr> <th width="20%">商品名</th> <td><select name="商品名1" id="banana1"> <option value="">商品をお選びください</option> <option value="バナナ1">バナナ1</option> </select></td> </tr> <tr> <th>個数</th> <td><input name="個数1" type="text" size="5" id="banana2" />個</td> </tr> </table> ・・・(オレンジまで続く) [javascriptファイル] window.onload=check; function check() { if(document.estimate.item1.checked) { jobShow('apple'); jobHide('banana'); jobHide('peach'); jobHide('berry'); jobHide('grape'); jobHide('lemon'); jobHide('melon'); jobHide('orange'); } if(document.estimate.item2.checked) { jobHide('apple'); jobShow('banana'); jobHide('peach'); jobHide('berry'); jobHide('grape'); jobHide('lemon'); jobHide('melon'); jobHide('orange'); } ・・・(item8まで続く) } こんな感じです。説明不足なのかもしれませんが、文字制限があるので全部かけそうにありません>< もしこの説明で分かる方いらっしゃいましたら、教えてください。 宜しくお願いします。

  • PHPを使ってMySQLのフィールドの追加ができない

    function部分は外部ファイル function getResult($query){ $result[result]=mysql_query($query,$this->connect) or die(mysql_error()); $result[count]=@mysql_num_rows($result[result]); return $result; } $null = ""; $query="insert into main values ($_POST[id],'$_POST[name]',$null,$null,$null,'$null')"; $insert[result]=$db->getResult($query); このように記述してmainテーブル内に新規フィールドの追加をしようとしたのですが、次のようなエラーが出ます。 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ',,'')' at line 1 $nullは結局NULL値なので、 ($_POST[id],'$_POST[name]',,,,) でやってみたのですが、これも同じです。 当たり前といえば当たり前ですが、 ($_POST[id],'$_POST[name]',,,,)を ($_POST[id],'$_POST[name]')と 省略してみましたが、数が合わないとエラーが返ってきました。 定型のfunctionに頼らず、$insert[result]=$db->getResult($query);のかわりに if(mysql_query($query,$db->connect)){ echo"成功"; }else{ echo"失敗"; } このようにも試してみたのですが、データは追加されず、失敗と表示されてしまいます。 どこをどう修正すればいいでしょうか。 どなたかお助けください。 ちなみに1,3~5番目が数値型で、2,6番目が文字型、1番目以外はNULLを許可しています。 どこもオートインクリメントは使用していません。

    • ベストアンサー
    • PHP
  • CakePHPとMySqlを使用しています。INSERTしたあと、id

    CakePHPとMySqlを使用しています。INSERTしたあと、idを取得する方法について教えて頂きたいです。 データをINSERTとSELECTをする関数を作成し、 メインの関数でINSERTとSELECTをする関数を呼び出すと、idがNULLとなってしまいます。 しかし、1つの関数でINSERTとSELECTを行うとidを取得する事ができました。 この方法は問題ないのでしょうか? この方法だとなぜidが取得できるんでしょうか? また、これ以外の方法でidを取得できる方法があればお教え頂きたいです。 宜しくお願いします。 【hogeテーブル】 id(PRIMARY。オートインクリメントさせています) name ●idがNULLになる方法 function main() { $this->insertHoge(); $id = $this->getHoge(); ←結果がNULLになる } function insertHoge() { $sql = "INSERT INTO hoge ('name') VALUES('ABC')"; $result = $this->query($sql); return $result; } function getHoge() { $sql = "SELECT id FROM hoge WHERE name='ABC'"; $result = $this->query($sql); return $result; } ●idが取得できる方法 function main() { $id = $this->insertHoge(); ←idがかえってくる } function insertHoge() { $sql = "INSERT INTO hoge ('name') VALUES('ABC')"; $result = $this->query($_sql); $sql = "SELECT id FROM hoge WHERE name='ABC'"; $result = $this->query($_sql); return $result; }

    • 締切済み
    • PHP