みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

mysql,GROUP BY,mysql_fetch_arrayを使っ

mysql,GROUP BY,mysql_fetch_arrayを使って、あるフィールドに入ってる項目を複数出したい。


わかりづらいタイトルで申し訳ありません。
ある項目を、登録数の多い順に一覧表示をし、それに関するコメントを表示と思っています。
countで数を取り、GROUP BYでまとめ、order byで並び変えをしています。
しかし、おそらくGROUP BYでまとめているせいで、本来フィールドに複数入っているものが1つしか出てきません。現在の環境とやりたいことをまとめさせていただきます。


【関連するテーブル】
game
 構造
 titleid , title
1 , 鬼武者3
2 , FF10
3 , ヴィーナス&ブレイブス ~魔女と女神と滅びの予言~
 ・
 ・
 ・
(本当はもう少し複雑ですが、今回の質問にはあまり関係がないためは省略しております)



tag
 構造
 tagid , tag
 1 , OPが素晴らしい
 2 , EDが素晴らしい
 3 , 世界観がいい
 ・
 ・
 ・


tag_title
 構造
 tagid , titleid , tagcom , tagcom_date(日付)
 1 , 1 , すばらしい , 2010-09-05
1 , 1 , やってよかった , 2010-09-05
1 , 2 , よくできている , 2010-09-05
 ・
 ・
 ・

上記3つのテーブルをメインに使います。


【表示したいこと】
 
OPがいいゲーム
 
 鬼武者3  登録数 : 3件 
  タグコメント: すばらしい(2010-09-05) / やってよかった(2010-09-05)
 ・
 ・
 ・
実際のページです ttp://www.game-minzoku.jp/tag.php?tagid=1



【組んだソース】 (CSSやら他のを省略)

$sql = "select * ,count(game.title)as count from game
left join tag_title on game.titleid = tag_title.titleid
left join tag on tag_title.tagid = tag.tagid
where tag_title.tagid = '{$tagid}' GROUP BY title order by count desc ";
$result = mysql_query($sql);
$rows = mysql_num_rows($result);

while($row = mysql_fetch_array($result)){

echo "登録数 : ";
echo $row["count"].件;

echo "<img src=\"",$row["img"],"\" alt=\"",$row["title"],"\" width=\"100\">";
echo $row["title"];
echo "タグコメント : ";

if ($row["tagcom"] != ""){
echo $row["tagcom"];
echo " (" . $row["tagcom_date"] . ") / ";
}
}


です。
前述もさせていただきましたが、おそらくGROUP BYでまとめると、1つしか出ないとかそんな感じだとは思うのですが、どうやって解消したら良いのかがわかりません。。。
(ttp://www.game-minzoku.jp/tag.php?tagid=1
が実際のページですが、タグコメントが複数登録されているものも、1つしか出てこなくなっている感じです)

拙いご説明で本当に恐縮ですが、もしお分かりになりましたらよろしくお願いします。

説明不足の点などあればおっしゃってください!

投稿日時 - 2010-09-05 16:38:55

QNo.6160547

すぐに回答ほしいです

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

今、PHPのソースが以下だとしたら、

if ($row["tagcom"] != ""){
echo $row["taggrp"];
}

原因はtagcomが空文字のためと思われます。
なので、次のようにしてみてください。
全てのコメントが表示されるようになると思います。

if ($row["taggrp"] != ""){
echo $row["taggrp"];
}

あと、SQLをPHPを介さずに、MySQLへ直接実行できる環境があるならば、
そうすることでSQLとしては正常に取得できているのかが分かると思います。
SQLの問題でなければ、PHPを疑ってみるとよいと思います。

投稿日時 - 2010-09-10 00:37:24

お礼

meeker-bot様


本当にありがとうございます!
いただいたソースで組ませていただいたところ、無事にコメントがすべて出るようになりました!
meeker-bot様には本当に長い時間いろいろと教えていただきまして、本当に感激しております!!
このたびは本当にありがとうございました!!

投稿日時 - 2010-09-11 19:29:19

このQ&Aは役に立ちましたか?

5人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.4

お疲れ様です。
なかなか解決できず申し訳ないです。

私の環境で試したところ、うまくいきました。
試した内容など、以下のリンクに書きました。
https://spreadsheets.google.com/ccc?key=0AoXfKJsAmCQ9dEJ3WGhuY3NQMThhUnJLeExZOXpVTmc&hl=ja&authkey=CIT2n_oK

なので、おそらくデータによって、うまくいかない事があるのだと思います。
私が試したデータと、hasu23さんの実データとの差異で、何か気づかれる点はあるでしょうか?


>ちなみに、ttp://www.game-minzoku.jp/tag.php?tagid=1 のページでは、FF12のコメントが出てきていませんが、FF12に関連するデータは、

> tagid , titleid , tagcom , tagcom_date(日付)
> 1 , 2831 , ,
> 1 , 2381 , 壮大のひとこと! , 2010-09-01

これは、titleidが2831と、2381の2種類ありますが誤記でしょうか?
また、コメントが出ないタイトルは、FF12以外にもあるのでしょうか。
コメントが出るタイトルと出ないタイトルのデータを比べることで、原因が分かる気がします。
原因が分かれば、例えばNULLデータが原因であればSQLでIFNULL関数を使うなど、対処できると思います。

投稿日時 - 2010-09-08 22:40:38

お礼

meeker-bot様

ご親切なご回答、本当にありがとうございます!本当に感謝しております!!

また、お忙しい中環境までおつくりいただきまして本当にありがとうございます!!


>これは、titleidが2831と、2381の2種類ありますが誤記でしょうか?

ちゃんと書かないといけないところで誤字をしてしまって申し訳ないです。
はい、こちらは 2381の誤字でございます。。

>私が試したデータと、hasu23さんの実データとの差異で、何か気づかれる点はあるでしょうか?

確認してみたところ、ほとんど差異はないように思えます。
あるとしたら、tagcomが[varchar(256)]ではなく[text (ujis_japanese_ci)]くらいでしょうか・・?



>また、コメントが出ないタイトルは、FF12以外にもあるのでしょうか。
これですが、探してみたらかなりあるようです。。
どうしてなのでしょうね・・・?

必要ないかもしれませんが、そちらも載せておきます。もし参考になれば幸いです。。

------------------------------------------------
ttp://www.game-minzoku.jp/tag.php?tagid=1
においてでないもの

titleid=2381
FF12


tagid , titleid , tagcom , tagcom_date
1 , 2381 , ,
1 , 2381 , 壮大のひとこと! , 2010-09-01

------------------------------------------------
ttp://www.game-minzoku.jp/tag.php?tagid=2
においてでないもの

titleid=714
ヴィーナス&ブレイブス ~魔女と女神と滅びの予言~


tagid , titleid , tagcom , tagcom_date
2 , 714 , ,
2 , 714 , 異論は認めない , 2010-09-02
2 , 714 , 感動した , 2010-09-02
2 , 714 , 泣けるし、心が暖まる , 2010-09-02

------------------------------------------------
ttp://www.game-minzoku.jp/tag.php?tagid=13
においてでないもの

titleid=1955
テイルズ オブ レジェンディア (Tales of Legendia)

titleid=2616
ペルソナ3

tagid , titleid , tagcom , tagcom_date
13 , 1955 , ,
13 , 1955 , 何でもないダンジョンでオペラが入るのは衝撃的だった , 2010-09-07
13 , 1955 , どれもよい , 2010-09-07
13 , 1955 , 最高だった , 2010-09-07
13 , 1955 , 世界観とストーリーに合ってた , 2010-09-07
13 , 1955 , ,
13 , 1955 , ダメな部分が多い中で、逆に音楽は際立っていた , 2010-09-09
13 , 1955 , ,
13 , 1955 , ,
13 , 2616 , ,
13 , 2616 , 全体的におしゃれ , 2010-09-07
13 , 2616 , 雑魚戦のBGMまで歌つきでやばい , 2010-09-07
13 , 2616 , サントラ買った , 2010-09-07
13 , 2616 , ,
13 , 2616 , 戦闘曲がいい , 2010-09-09
13 , 2616 , ,
13 , 2616 , ,
13 , 2616 , ,

------------------------------------------------

などです。
書いていて気がついたのですが、どうやらコメントが出ないものは一番最初の投稿がコメントが入っていないもののようです。(5~6確認しましたが、すべてに共通しています。逆にコメントが出ているものは最初の投稿にコメントが入っています)

本当にたびたびで恐縮ですが、
もし何かお分かりになりましたらお時間があるときで本当に構いませんので、よろしくお願いいたします!

投稿日時 - 2010-09-09 21:52:24

ANo.3

コメントの間に日付を入れる場合、次のようになります。
このように、カンマで区切って表示したい値を追加できます。
separatorというのは、区切り文字です。これを省略した場合は、カンマで区切られます。

select * ,group_concat(tag_title.tagcom, '(', cast(tag_title.tagcom_date as char), ')' separator "/") as taggrp, count(game.title)as count

データが入っているのに何も出ないものに関しては、
実際のデータを見せて頂ければ分かると思います。

また、今後カスタマイズされると思いますので、group_concat関数について説明しますと
hasu23さんが「おそらくGROUP BYでまとめると、1つしか出ないとかそんな感じだとは思うのですが、」
と書かれている通りで、GROUP BYを使った場合は本来1つの値しか出ません。
その、まとまって1つになろうとしている、「まとまる前の複数のデータ」を横に繋げて表示するのが
group_concatです。

参考になれば幸いです。

投稿日時 - 2010-09-07 23:15:52

お礼

meeker-bot様


なんども本当にありがとうございます!いろいろ教えていただいて本当にうれしいです。
教えていただいた
select * ,group_concat(tag_title.tagcom, '(', cast(tag_title.tagcom_date as char), ')' separator "/") as taggrp, count(game.title)as count
は何故か、該当データが表示されなくてできなかったのですが、group_contactとseparatorを教えていただいたので(本当にありがとうございます!)、自分なりに調べて
select * ,group_concat(tag_title.tagcom SEPARATOR ' ') as taggrp, count(game.title)as count
でいったん落ち着かせてみました。
日付を出すのはは、いったん断念しました。あればよいなあ、という感じでしたので。。

また、これまではスラッシュ区切りでと考えていたのですが、実際にやってみると、コメントが入っていないものもあるので、
 よかった/すばらしい//最高だった
みたいにスラッシュが二重ででてくるところもあったので、ちょっとごまかしを入れて半角スペースにしてみました。

またデータが入っているのに出ないものについてです。
ご説明が不足していて大変申し訳ないのですが、tag_titleテーブルですが、

 構造
 tagid , titleid , tagcom , tagcom_date(日付)
 1 , 1 , すばらしい , 2010-09-05
1 , 1 , やってよかった , 2010-09-05
1 , 2 , よくできている , 2010-09-05

となっていますが、中にはtagcomとtagcom_dateが入っていないものもあります。
tagid,とtitleidで二つをひも付けしているので、この二つは絶対に入っています。
tagcomがはいっているものに関しては、100%日付もはいります。

コメントが表示されないものに関して、ひょっとしたらこのtagcomの空欄が問題になっていて、tagcomが空欄になっている状態のがあるものはすべて表示されなくなるのではないかと仮説してみたのですが、どうもそれも違うようです。。


>データが入っているのに何も出ないものに関しては、
>実際のデータを見せて頂ければ分かると思います。


これについては、どのような形でお見せすればよいでしょうか??

ちなみに、ttp://www.game-minzoku.jp/tag.php?tagid=1 のページでは、FF12のコメントが出てきていませんが、FF12に関連するデータは、

 tagid , titleid , tagcom , tagcom_date(日付)
 1 , 2831 , ,
1 , 2381 , 壮大のひとこと! , 2010-09-01

の2つだけです。
tagidも違うのであれば、もっとあります。
データの開示はまったく問題ないので、あれはこれは、などあればぜひぜひおっしゃってください!


meeker-bot様には本当に貴重なお時間を頂戴してしまって恐縮です。
お時間があるときで本当に大丈夫なので、もしお分かりになりましたらよろしくお願いいたします!

投稿日時 - 2010-09-08 01:18:23

ANo.2

別名(as句)を変えてみてください。
select * ,group_concat(tag_title.tagcom) as taggrp, count(game.title)as count

PHP側では、
echo $row["tagcom"];
echo " (" . $row["tagcom_date"] . ") / ";
の2行の代わりに、

echo $row["taggrp"];
としてみてください。

今は時間がないので、この程度しか回答できないですが、
よろしくお願いします。

投稿日時 - 2010-09-06 06:46:50

お礼

何度も本当にありがとうございました!
上記記述をしたところ、複数のコメントがでるようにりました!

と思って喜んでいたのですが、よくよくデータと照らし合わせてみると、ちゃんと複数でてくるものと、入っているのに何も出てこないものが混在しているようです。。これは別の記述が邪魔しているということなんでしょうか・・・?
(ttp://www.game-minzoku.jp/tag.php?tagid=1 で、FF12もコメントがあるのですが、出てこないといった感じです)

また、コメントとコメントの間に、日付などをいれたいのですが、これもどうしたらよいのでしょうか??

聞いてばかりで本当に申し訳ありません!!
もしお分かりになればで構いませんので、よろしくお願い致します!

投稿日時 - 2010-09-07 12:17:42

ANo.1

まず、
select * ,count(game.title)as count from game
の部分を、
select * ,group_concat(tag_title.tagcom) as tagcom, count(game.title)as count from game
にしてみて、結果を見てみてください。

うまくいきそうだったら、以下を試してください。(日付が文字型であれば、castは必要ないです)
select * ,group_concat(tag_title.tagcom, '(', cast(tag_title.tagcom_date as char), ')' separator "/") as tagcom, count(game.title)as count from game

実際に試していないので、間違っていたら申し訳ないです。

実際のページを見させて頂きました。
面白いページですね。がんばって下さい。

投稿日時 - 2010-09-05 23:46:25

お礼

お早いご回答ありがとうございます!!
いただいた
select * ,count(game.title)as count from game
 ↓
select * ,group_concat(tag_title.tagcom) as tagcom, count(game.title)as count from game
をさっそく試させていただいたのですが、上手くいかないようでした。。(画面が白くなりました)
下のも同じでした。(日付はdateで入っています。)

本来ならば、ご助言いただいたものを自分なりに調べ、カスタマイズして実現させたいところなのですが、なかなか勉強が追いつかず、どこをどう触ればいいのかがわからなくて、、申し訳ないです。。

また、ページも見ていただきありがとうございます。
そういっていただけると、努力が報われます。ありがとうございました!

投稿日時 - 2010-09-06 00:49:05

あなたにオススメの質問