• ベストアンサー

mysqlのSQL文の書き方についてご質問いたします。

下記のようなテーブルがあるとします。 [table_a] type,name1,name2 ---------------- 1,sato,keiko 2,ito,yoko 2,kishi,hruna 3,yasuda,fumi 上記テーブルに対して下のSQL文を発行すると SELECT type, CONCAT( name1,name2 ) FROM table_a 実行結果 type,CONCAT( name1,'-',name2 ) ------------------------------ 1,sato-keiko 2,ito-yoko 2,kishi-hruna 3,yasuda-fumi 上記のような実行結果が得られるかと思います。 ですが、typeの値が重複したときに一行で出力したい場合は どのようなSQL文を発行するのが良いのでしょうか? 得たい実行結果は下記となります。 実行結果 type,(連結された値) ------------------------------ 1,sato-keiko 2,ito-yoko kishi-hruna    ←typeの値が同じだったので一行に 3,yasuda-fumi 色々試してはみたのですが、なかなか解決できずにいます。 もしよろしければ、お力添えお願いします。

  • MySQL
  • 回答数3
  • ありがとう数7

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

  • ベストアンサー
回答No.2

MySQLでだけ動けばいいなら、独自機能のgroup_concatという関数があります。 http://dev.mysql.com/doc/refman/5.1/ja/group-by-functions.html

saki_0109
質問者

お礼

chukenkenkouさん、ご回答ありがとうございます。 MySQLにこのような関数があることには気がつきませんでした。 なんとなく統計などに使いそうなイメージだったのですが値をつなぎ合わせるという意味で簡潔なアプローチができそうです。 この方向でSQL構文を書いてみようと思います。

その他の回答 (2)

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

#2は盲点でした。 たしかにそんな関数が追加になっていますね。 SELECT type, GROUP_CONCAT(DISTINCT CONCAT( name1,'-',name2 ) SEPARATOR ' ') FROM table_a GROUP BY type;

saki_0109
質問者

お礼

yambejpさん、ご丁寧な回答ありがとうございます。 上記のSQL文で期待していた結果が得られました。 自分でもいろいろ調べたのですが、GROUP_CONCAT()は連結するカラムのなかに数値型あるとBlobで返すということもわかりました。 より汎用的数値やテキストを混合して使うときには、 SELECT type, SUBSTRING(GROUP_CONCAT(DISTINCT CONCAT(name1,'-',name2 ) SEPARATOR ' '),1) FROM table_a GROUP BY type; と文字列として切り出してやることで表示できるようです。 今回はyambejpさんやchukenkenkouさんのおかげでとても勉強になりました。本当にありがとうございます。

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

ダブりの数の上限値がわかっているなら、その回数だけ joinしてconcatすればいけそうな気がします。 無理やりやるなら変数をつかっても不可能ではないでしょう。 正直言うとこれってSQLの仕事じゃない気がします 出力の際にミドルウェアで処理してみては?

saki_0109
質問者

お礼

yambejpさん、ご回答ありがとうございます。 現状、ダブりの上限は決まっているのですが今後増えることを想定すると 出力時結果をPHPなどで処理するのがいいとのこと理解いたしました。 スマートではないかもしれませんがSQL構文の勉強として変数を使う方法というのも自分なりに調べてみようと思います。

saki_0109
質問者

補足

yambejpさん、ご回答ありがとうございます。 もし、yambejpさんがSQL文だけで無理やり行うとしたら どんな感じで構文を書かれますか? 参考にしてみたいのでもしよろしければ教授いただけないでしょうか。

関連するQ&A

  • My SQL の concat文について

    あるテーブルtable01にname列があったとします。 その列に ”様" をつけたいと思い、concat文を使おうと思い、 以下のようにしたのですが、 mysql> Select concat(name,"様") from table01; +-------------------+ | concat(name,"様") | +-------------------+ | ito様 | | sato様 | | aikawa様 | | abe様 | | yamada様 | +-------------------+ 5 rows in set (0.00 sec) 列名もconcat(name,"様")となってしまっていますが、 As nameを使う以外に nameとだけ表示させる方法はありますか?

    • ベストアンサー
    • MySQL
  • mysqlでのsql文

    下記のようにテーブルが有り、外部キーの設定も済んでいますが、 PHPファイル内で「select * form song WHERE song_name LIKE '%%'」と実行すると 「0,眠り姫,0」と表示されます。 このsql文を実行した上の結果の一番右側を「0」でなく「栗林みな実」と出力したいのですが、 なにぶん最後にsqlを扱ったのが5年以上前で、 全部頭から抜けてしまっていますorz 外部キーは「song」テーブルのkashu_IDと「kashu」テーブルのkashu_IDに設定してあります。 mysqlのバージョンは5.1.69

    • ベストアンサー
    • MySQL
  • MySQL文がわかりません。

    いつもお世話になってます。 PHP+MySQLを使用しています。 下記のような操作を行いたいのですが、 MySQL文を教えて頂けませんでしょうか。 table名:person person_id : name : email 1 : tanaka : aaaaa 2 : suzuki : bbbbb 3 : sato : ccccc 4 : saito : ddddd 5 : takahasi : eeeee 上記のようなテーブルがあったとして、 例えば、person_idが2,4のものを抽出して、 table名:sendmail send_id : name : email : ticket 1 : ito : fffff : 10-20 2 : huruka : eeeee : 11-01 3 : suzuki : bbbbb : 11-19 4 : saito : ddddd : 11-19 上記テーブルに追加(send_idの3,4)したいのです。 ticketカラムは、send_idの3,4で同じ値(文字列)を使います。 大変お手数ですが、上記内容にてご教授願います。

    • ベストアンサー
    • MySQL
  • MySQL文(プリペアドクエリ)がわかりません。

    いつもお世話になってます。 PHP+MySQLを使用しています。 下記のような操作を行いたいのですが、 MySQL文を教えて頂けませんでしょうか。 table名:person person_id : name : email 1 : tanaka : aaaaa 2 : suzuki : bbbbb 3 : sato : ccccc 4 : saito : ddddd 5 : takahasi : eeeee 上記のようなテーブルがあったとして、 例えば、person_idが2,4のものを抽出して、 table名:sendmail send_id : name : email : ticket 1 : ito : fffff : 10-20 2 : huruka : eeeee : 11-01 3 : suzuki : bbbbb : 11-19 4 : saito : ddddd : 11-19 上記テーブルに追加(send_idの3,4)したいのです。 ticketカラムは、send_idの3,4で同じ値(文字列)を使います。 SQL文だと、 INSERT INTO sendmail (name,email,ticket) SELECT name,email,'11-19' FROM person WHERE person_id IN ( 2 , 4 ) で大丈夫なのはわかりました。 これをプリペアドクエリに変換する方法がわかりません。 $para01="11-19"; $para02="2,4"; $db = new mysqli("xxxxx","yyyyy","zzzzz","wwwww"); $presql = $db->prepare("INSERT INTO sendmail (name,email,ticket) SELECT name,email,? FROM person WHERE person_id IN ( ? )"); $presql->bind_param("ss",$para01,$para02); $presql->execute(); 上記で実行してみましたが、$para02は"2"と判断されて、 table名:sendmail send_id : name : email : ticket 1 : ito : fffff : 10-20 2 : huruka : eeeee : 11-01 3 : suzuki : bbbbb : 11-19 になります。(person_idが4のものが抽出されない。) 大変お手数ですが、上記内容にてご教授願います。

    • ベストアンサー
    • MySQL
  • PHP/MySQL SQLエラーについて。

    PHP/MySQLについての質問です。 当方PHP/MySQLについては初心者で、現在参考書を見ながらWebアプリケーションを作成しています。 いくらやっても成功しない例があるので、どこが間違っているのか、 なぜ成功しないのかご教示願いたいです。 エラー名:SQL実行エラー 要因:不明。SQL文を変えたりしたところ成功したこともあるので(elect id,name,age from input_table 等)SQL文に間違いがあるのか? -------------------input.html------------------------ <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <form action="input.php" method="post"> 名前:<input type="text" name="nm"> 年齢:<input type="text" name="age"> <input type="submit" name="exec" value="登録"> </form> </body> </html> -----------------------input.php---------------------------- <!DOCTYPE html> <html> <head> <meta charset="utf-8"> </head> <body> <?php //DB接続 if(!$con=mysql_connect("localhost","root","********")){ //passwardは正確 echo"接続エラー"; exit; } //DB選択 if(!mysql_select_db("input",$con)){ echo"DB選択エラー"; exit; } $sql = "insert into input_table(name,age) values('$nm',$age)"; if(!$res=mysql_query($sql)){ echo"SQL実行エラー"; //ここでこのエラーが表示されてしまう exit; } echo "登録完了"; mysql_close($con); ?> </body> </html> --------------------database----------------------- create table input_table( id int not null auto_increment, name varchar(20) not null, age int not null, primary key(id) )

    • ベストアンサー
    • PHP
  • mysql insert文

    恐れ入ります。 input 送信で、perl にてレコードをinsertしたいのですが、なかなかうまくいきません。 <form action="./xxx.cgi" method="post"> <input type ="hidden" name=num></input> <input type="text" name="col1"></input> <input type="text" name="col2"></input> <input type="text" name="col3"></input> <input type="submit" value="登録"> </form> として送信して、 $sql = "insert into kensou(num,col1,col2,col3) "; $sql.="values('$form{num}','$form{col1}','$form{col2}','$form{col3}')"; # SQL実行 $sth = $db->prepare($sql); if(!$sth->execute){ print "SQL失敗\n"; exit; } で受け取ろうとしているのですが、うまくいきません。 どなたかご教授いただけないでしょうか。

  • (2)-SQL文の書き方を教えてください。

    table項目:名称、日付、数量。 以上のtabelから以下のクエリーをつくりたいです: クエリー項目:名称、当日数量、当月数量。 日付の値は、フォーム上で指定する。 具体的に:フォーム上日付欄に2003/10/01と2003/10/30を指定し、実行すると、当日数量は、2003/10/30その日の合計数が出る。当月数量に指定された10/01から10/30までの数字の合計がでる。 今、片方だけ条件のSQL文を書けるですが、二つ条件のSQL文がとても難しい。 そうゆうSQL文を教えていただけませんか? よろしくお願いいたします。

  • SQLで取得したフィールドをSQL文として利用

    お世話になっております。 MYSQLで sql_id (int PK) sql_data (text) のようなテーブル(sql_db)を持ち select sql_id from where (sql_data をsqlとして実行した結果 ) > 200 のように、フィールドから取得した値をSQLとして実行したりする方法はございますでしょうか。 ご教授よろしくお願いいたします。

  • SQL文 テーブルの作成方法について

    以下のようなTABLE1からTABLE2というテーブルを作成したいと考えております。 元テーブル(TABLE1)は、IDという項目がキーとなってデータが入っており、NAME1とNAME2という項目があります。 (NAME1は必ず値が入っていますが、NAME2は値が入っていない場合もあります) 加工後のテーブル(TABLE2)で、NAME1とNAME2の値を結合した形で結果を出力したいと考えております。 (新たに作成したNAMEカラムは、必ずしもユニークになっているとは限りません。NAMEとIDを組み合わせるとユニークになります) ---------------------------------------------------- ■ TABLE1 ID NAME1 NAME1_CATE NAME2 NAME2_CATE ---------------------------------------------------- 001 鈴木 A 山田 B 002 山本 A 003 佐藤 A 高橋 B ---------------------------------------------------- ---------------------------------------------------- ■ TABLE2 ID NAME NAME_CATE ---------------------------------------------------- 001 鈴木 A 001 山田 B 002 山本 A 003 佐藤 A 003 高橋 B ・・・ ---------------------------------------------------- いろいろ試していますが、どのようなSQL文を書いたらよいのか分かりません。 現状のSQL(エラーとなります) ====================================================================================== SELECT ID, NAME, NAME_CATE FROM (SELECT ID, NAME1 as NAME, NAME1_CATE as NAME_CATE FROM TABLE1 WHERE NAME1<>NULL) JOIN (SELECT ID, NAME2 as NAME, NAME2_CATE as NAME_CATE FROM TABLE1 WHERE NAME2<>NULL) ====================================================================================== 初歩的な質問になるかと思ってしまうかと思いますが、よろしくお願いいたします。

  • MySQLで戻り値が重複している

    PHPとMySQLを使っています。 下のようなSQL文を作成し、値を引き出そうとしています。 <SQL文> SELECT * FROM table_name WHERE A = "あ" AND B='い' <DBに登録済みの取り出したいデータ> あ、い、う、え、お ところが、戻ってくる値が、 あ、あ、い、い、う、う、え、え、お、お のように、値が重複して戻ってきます。 いろいろ調べましたが、原因がさっぱりわかりません。 ご存知の方、教えていただけると助かります。 よろしくお願い致します。

    • ベストアンサー
    • MySQL