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

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

解決済みの質問

mysqlで連結先のテーブルをカウント

mysql php 超初心者です。
mysqlで連結先のテーブルのカウントを取得したいと思っています。
以下のような a_tblと b_tbl があり、
a_tbl の a_index と b_tbl の ab_no を
結合して b_tbl の ab_no のカウント数を
理想結果表に表示したいと思っています。
どう書いたら b_tbl の ab_no をGROUP(?) COUNTして
理想結果表の様にbテーブルのab_noのcount数を表示できるのでしょうか?


-a_tbl-
a_index | a_data
1 | りんご
2 | 信号
3 | 空
4 | カラス

-b_tbl-
b_index | ab_no | b_data
1 |  1 | 青
2 |  1 | 赤
3 |  2 | 青
4 |  2 | 赤
5 |  2 | 黄
6 |  3 | 青
7 |  3 | 白
8 |  3 | 黒
9 |  4 | 黒

-理想結果表-
a_index |a_data   | bテーブルのab_noのcount数
1 | リンゴ   | 2 色
2 | 信号   | 3 色
3 | 空   | 3 色
4 | カラス  | 1 色

私が見よう見まねで考えた式ですが、やはりこれでは表に2しか出ませんでした。

$sql = "SELECT Count(*) AS cnt FROM b_tbl
LEFT JOIN a_tbl ON b_tbl.ab_no = a_tbl.a_index GROUP BY b_tbl.ab_no";

質問の仕方もよくわからないのでわかりにくいかも知れませんが
どうかご教授の程よろしくお願い致します。

投稿日時 - 2013-02-04 10:32:12

QNo.7927230

すぐに回答ほしいです

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

>$rst = mysql_query($sql, $con);

おそらく参考にされている書籍やサイトが古いですね
すでにmysql_query()は非推奨になっていますので
いまはmysqli系の処理か、PDOを利用した処理が正しいです。
環境を見直したほうがよいかと思います。

投稿日時 - 2013-02-05 13:08:15

お礼

ご回答ありがとうございます。
ご親切に色々教えて頂いて大変助かります。
推奨されていないという事全然知りませんでした。
何かセキュリティ的なものでしょうか?
見直してみます。ほんとうにありがとうございました。

投稿日時 - 2013-02-06 08:30:48

ANo.3

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

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

回答(3)

ANo.2

うごくかわからないですが

select a_tbl.a_index, a_tbl.a_data, color.cnt from a_tbl, (select ab_no, count(*) as cnt from b_tbl group by ab_no) color where a_tbl.a_index = color.ab_no;

投稿日時 - 2013-02-04 15:04:11

お礼

ご親切なご回答大変ありがとうございます。
こんな式があるのですね!
color が入っているので何か色取得でしょうか?
本当に申し訳ないのですが、質問した式は簡素化して
色の数だと皆さんにわかって頂けるかな?と思い
例題とし書かさせて頂きました。
ただcolorを抜きにしてもこの式は私には
難しくてよくわかりませんでした。
しかし、私がやってみたかったのはこの式のとおりfrom a_tbl,からの式ですので、私なりにfrom a_tblから何とかならないか?と考えていました。(select ab_no, count(*) as cnt from b_tbl group by ab_no) という書き方も有るのですね。今度使ってみようと思っています。大変勉強になり参考になりました。ありがとうございます。また何かありまたら是非よろしくお願い致します。

投稿日時 - 2013-02-05 09:22:19

ANo.1

>やはりこれでは表に2しか出ません

おそらく、データを回してないからでしょうね

$sql = 'SELECT a_index,a_data,Count(*) AS cnt FROM b_tbl
LEFT JOIN a_tbl ON b_tbl.ab_no = a_tbl.a_index GROUP BY b_tbl.ab_no';

foreach ($conn->query($sql) as $row) {
print $row['a_index'] . "\t";
print $row['a_data'] . "\t";
print $row['cnt'] . "<br>\n";
}
のようにループしてデータを抜き出してください

投稿日時 - 2013-02-04 11:11:33

お礼

お礼が遅くなりまして申し訳ありません。
質問してから色々考えさせて頂いていました。
この通りにやったら出来ました。ループさせる式や仕組みがわかっていないのですが、
ループしていなかったのが原因でした。
ただ私は前からwhileを使っていたので
以下のようにしてみました。これでもできました。


$sql = 'SELECT a_index,a_data,Count(*) AS cnt FROM b_tbl
LEFT JOIN a_tbl ON b_tbl.ab_no = a_tbl.a_index GROUP BY b_tbl.ab_no';

$rst = mysql_query($sql, $con);

while($col = mysql_fetch_array($rst)) {
$cnt = $col[cnt];

$body .= "<TR>
<TD>$col[a_index]</TD>
<TD>$col[a_data]</TD>
<TD>$cnt</TD> </TR>";}

ご回答大変参考になりました。
本当にありがとうございました。
また何かありましたら是非よろしくお願い致します。

投稿日時 - 2013-02-05 09:10:31

あなたにオススメの質問