電子書籍の厳選無料作品が豊富!

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";

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

A 回答 (3件)

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



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

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

お礼日時:2013/02/06 08:30

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



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;
    • good
    • 0
この回答へのお礼

ご親切なご回答大変ありがとうございます。
こんな式があるのですね!
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

>やはりこれでは表に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";
}
のようにループしてデータを抜き出してください
    • good
    • 0
この回答へのお礼

お礼が遅くなりまして申し訳ありません。
質問してから色々考えさせて頂いていました。
この通りにやったら出来ました。ループさせる式や仕組みがわかっていないのですが、
ループしていなかったのが原因でした。
ただ私は前から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

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!