• 締切済み

MySQLを使って値を引っ張ってきているのですが、1つしかとってこれません。

HPを作っている者です。 perlとMySQLを使ってデータをHPに表示させているのですが、下記のような方式でデータを取出した場合に問題がおきました。  掲示板を作成しています。 Aテーブルから掲示されたデータを取ってくる際に、一覧表示させました。 一覧表示から「詳細」をクリックすると詳細掲示と詳細掲示に対して意見を述べる書込みが表示されています。(意見の述べる所はBテーブルから引っ張ってきています。)  一番最初に記述したとおりAテーブルから掲示されたデータを取出して一覧表示する際に、個々の掲示情報に「意見を述べる書込み」Bテーブルが何件あるのかも表現しようと思ったのですが、値を表示することもできず、あげくのはてに一覧表示どころか1番目のデータしかとってこなくなり、後のでーたは空白表示されるようになってしまいました。 どうかどんな情報でも良いのでアドバイスをいただけないでしょうか?お願いします。 ソース開始---------------------------------- *ここにAテーブルからデータを取ってくる処理をしています。(省略) ###$num件分処理を繰り返す(一覧) for ($i=0; $i<$num; $i++) { ###データを吐き出す @buffer = $Com::sth->fetchrow_array; ###Bテーブルの件数を吐き出す $COUNT=qq{SELECT count(*) }; $COUNT.=qq{FROM Atable,Btable }; $COUNT.=qq{WHERE Atable.A = Btable.B}; &Com::DB_ExecuteNofinish($COUNT,$err); @Kakikomi = $Com::sth->fetchrow_array; $Com::sth->finish; *ここにAテーブルのデータとBテーブルのデータを引き出したHTMLが表示されます。 一覧表示(省略)

  • aeic
  • お礼率10% (60/582)

みんなの回答

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

SELECT count(*) FROM Atable,Btable WHERE Atable.A = Btable.B; 上記クエリで、望んだ情報がとれてますか? これだと、結局意見の総件数を返しているだけで、しかもループ不変だと思われますが。 各掲示IDについての意見数だったら、こんな感じじゃ無いでしょうか? select count(*) from Btable where B='${掲示ID}'; あるいは、一発で全部取るなら、 select TA.A, Count(TB.B) from Atable TA left join Btable TB on TA.A=TB.B group by TA.A; とか。

関連するQ&A

  • MySQLのDB

    現在MySQLのDBを使いWeb上で情報を検索できる物を作っています。外の時に県名を入れてもらいその県名に当てはまる物を抽出するというものをやりたいのですが、どうしてもDBの所で止まってしまいます。 どうかおしえていただけないでしょう?下記参照 --参照-- my $num; my $str1SQL; $str1SQL=qq{SELECT kyu16 }; $str1SQL=$str1SQL.qq{FROM kyu_table }; if($ADDR1 eq "茨城県"){ # 場所(県) $STRSQL=$str1SQL; $STRSQL=$STRSQL.qq{WHERE kyu16 LIKE "%$ADDR1%" }; } if ($DEBUG_FLG eq '1') {print "STRSQL=$STRSQL<BR>\n";} # debug $sth = $Com::db->prepare($STRSQL) or &Com::ErrorDB("<BR><FONT COLOR=\"#FF0000\" SIZE=+1><B>エラーコード:検索04<br>$ERRDBMSG</B></FONT><BR>"); $sth->execute or &Com::ErrorDB("<BR><FONT COLOR=\"#FF0000\" SIZE=+1><B>エラーコード:検索05<br>$ERRDBMSG</B></FONT><BR>"); $num = $sth->rows; if ($DEBUG_FLG eq '1') {print "num=$num<BR>\n";} # debug

    • 締切済み
    • CGI
  • 最大値の数をカウントしたい

    初心者ですが、よろしくお願いします。 Pointの最大値を持つレコードの件数をカウントするために、 $sth = $dbh->prepare(SELECT COUNT(MAX(Point)) FROM table); $sth -> execute(); $count = $sth -> fetchrow_array(); としたのですが、うまくいきません。 COUNT()の中にMAX()を入れられないのでしょうか? だとしたらどのように書けば動くようになるでしょうか? 初歩的な質問かもしれませんが、いろいろ調べてもよくわかりません。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • どちらが速いのか?mysql_num_rows

    どちらの処理が早くなりますか?またメモリの使用量はどちらが優れているのでしょうか? また、方法Bのクエリ実行は2回だと思いますが、方法Aはクエリの実行は一回と考えてもいいのでしょうか? PHPとMySQLの環境です。 また、評価のやり方も教えて頂ければ大変ありがたいです。 ■方法A $q = "SELECT key, a, b, c FROM d WHERE a < 1 AND b > 1 ORDER BY c"; $rs = mysql_query ($q); $row_num = mysql_num_rows ($rs); while ($data = mysql_fetch_array ($rs)) { echo $data[key] . $data[a] . $data[b] . $data[c]; } ■方法B $q_c = "SELECT COUNT(key) AS count FROM d WHERE a < 1 AND b > 1"; $rs = mysql_query ($q_c); $data = mysql_fetch_array ($rs); $row_num = $data[count]; $q = "SELECT key, a, b, c FROM d WHERE a < 1 AND b > 1 ORDER BY c"; $rs = mysql_query ($q); while ($data = mysql_fetch_array ($rs)) { echo $data[a] . $data[b] . $data[c]; } 是非宜しくお願い致します。

    • ベストアンサー
    • PHP
  • PerlでMySQLのテーブル一覧取得

    PerlでMySQLのデータベース内のテーブル一覧を取得することはできますか? 自分で以下の様なサブルーチンを作りましたが、返り値に何も入っていませんでした。 コマンドラインでもshow tables;で確認したのでテーブルは確実に存在します。 接続も showでfetchrow_arrayなどは使えないのでしょうか? またselect文でテーブル一覧を取得する方法がありましょうか? Error: failed to connect to DB.とは出てこないので、接続も成功しています。 sub mysql_tablesGet{ my @data=@_; my $db_id = $data[0]; my $db_password = $data[1]; my $dbh = DBI->connect("dbi:mysql:dbname=".$ftp_id.";host=$mysql_host", $db_id,$db_password) or die "$!\n Error: failed to connect to DB.\n"; my $sth = $dbh->prepare("show tables;"); $sth->execute; my @response; my $i=0; while(my @var = $sth->fetchrow_array){ my ($table_name) = $var[0]; $response[$i] = $table_name; $i++; } $dbh->disconnect; return @response; } MySQLのログはこんなのが出ています。 130406 17:11:44 70 Connect test2@192.168.11.22 on test2 70 Query set autocommit=1 特にエラーは出ていないので、show tables;は成功していると思います。

    • ベストアンサー
    • Perl
  • SQLが応答しなくなっているのか、CGIが読み込み中のままになってしまいます。

    SQLを約1600回実行したら、5秒後にページを再読み込みします。 print "<html><body onload=\"setTimeout('location.reload()',5000)\">"; foreach ... {   ...   # 約1600回繰り返す   @result = select("SQL文");   ... } sub select{   my @result = ();   my($dbh, $sth);   $dbh = DBI->connect('DBI:mysql:データベース:localhost', "ID", "パスワード") or return 0;   $sth = $dbh->prepare("$_[0]");   $sth -> execute() or return 0;   $num_rows = $sth->rows;   $num_of_fields = $sth->{NUM_OF_FIELDS};   $result[0] = $sth->rows;   for ($i=1; $i<=$num_rows; $i++) {     @fetchrow_array = $sth->fetchrow_array;     $result[$i] = join ',', @fetchrow_array   }   $sth -> finish();   $dbh -> disconnect();   return @result; } 最初の1,2回は期待通りに動くのですが、 2,3回ほど再読み込みをすると、「読み込み中」のままになってしまいます。 (期待通りに動く場合、1回の読み込みは20秒程度です。) タスクマネージャを見ると、 期待通りに動いているときは、CPU使用率が60%くらいになっていますが、 「読み込み中」のままの時は1%程度になっています。 SQLサーバーから応答がなくなっているのでしょうか? (簡単なSQLにしてみても同じでした。) 原因がわかる方、よろしくお願いします。 WindowsXP SP2 Apache1.3 ActivePerl5.6 MySQL3.23

    • ベストアンサー
    • CGI
  • 配列に入った変数を二度使いたい

    perlでDBデータをセレクトし表示させるプログラムで 以下のように一回目のforループでは正常に表示されます。 二度目に表示させようとすると何もデータがなくなっているようです。 print でも、もちろんなにも表示しません。 配列名を変えてもだめでした。とこが原因なのかわかりません。 ステートメントハンドルとかが関係あるのでしょうか? いろいろ調べたのですが、ちょっとわかりませんでした。 申し訳ないのですが、教えてください。 話をまとめるとDBからセレクトした同じ行のデータを2回表示させたいということです。 よろしくお願いします。 my $db = DBI->connect("DBI:Pg:dbname=$UDBNAME",$USERNAME,$USERPASS); my $sth=$db->prepare(" select * from server where no = $no "); $sth->execute; #一回目 for ((my $count)=0; $count<$num_rows;$count++){ my @ar=$sth->fetchrow_array; #二回目 for ((my $count)=0; $count<$num_rows;$count++){ my @ar=$sth->fetchrow_array;

    • ベストアンサー
    • Perl
  • DBIを使ってSelect文 複数のカラム、複数のレコードを取得するには?

    Perl DBIを使用してDB検索する部分で質問させてください。 検索してきた複数のレコードの中のカラムを全て取得したいのですが うまくできません。 テーブルAAAに フィールドa,b,cがあり、レコードが3つ入っているとします。 テーブルAAA a b c ------ 1 2 3 4 5 6 7 7 7 $sqlState= "select a,b,c from AAA"; $sth= $dbh->prepare($sqlState); $sth->execute; @row = $sth->fetchrow_array; foreach (@row){ ($a,$b,$c,)= @row; print $a; print $b; print $c; } このようなコードでいいのかと思うのですが 出力結果は111 222 333 となってしまってまるで期待通りの結果にはなりませんでした。 上記の例では 123 456 777 という出力結果を望むとすると、どのように記述すればよろしいのでしょうか?

  • mysqlのデータをperlで読み込んで????を表示される

    過去にもあった質問なのですが、アドバイスお願いします。 perlからmysqlにアクセスしてデータを読み込むと日本語が「??????」と表示されます。 バージョンは下の通りです。 perl:ActivePerl-5.8.8.820-MSWin32-x86-274739 mysql:5.0 OS:windowsXP mysqlの文字コードはstatusで確かめました。 mysql> status; -------------- mysql Ver 14.12 Distrib 5.0.27, for Win32 (ia32) Connection id: 74 Current database: Current user: ******@localhost SSL: Not in use Using delimiter: ; Server version: 5.0.27-community-nt Protocol version: 10 Connection: localhost via TCP/IP Server characterset: sjis Db characterset: sjis Client characterset: sjis Conn. characterset: sjis TCP port: 3306 Uptime: 3 hours 39 min 2 sec Threads: 1 Questions: 232 Slow queries: 0 Opens: 26 Flush tables: 1 Open ta bles: 0 Queries per second avg: 0.018 -------------- mysql> SELECT * FROM table1 と打てば、日本語は表示されます。 perlのコードのコードを書きます。 #!C:/usr/local/Perl/bin/perl print "Content-type: text/html;charset=Shift_JIS\n\n"; use DBI; $user = '***'; $passwd = '***'; $sql="SELECT * FROM categ"; ----略(HTMLタグ)------ $db = DBI->connect('DBI:mysql:board:localhost', $user, $passwd); $sth = $db->prepare($sql); $sth->execute; $num_rows = $sth->rows; $categ_num=$num_rows; for ($i=0; $i<$num_rows; $i++) { @a = $sth->fetchrow_array; print"$a[0] $a[1]<br>"; } $sth->finish; $db->disconnect; ----略(HTMLタグ)------ 結果 0 ????? 1 ????? ブラウザで文字の種類を変えても「?????」のままです。 mysqlのテーブルから取り出した値をjcode.plで変換しても変わらないようです。 &jcode::convert(\$categ[$i], "sjis"); print"<tr><td>no:$i $categ[$i] </td></tr>"; まだ、設定の足りないところがあるのでしょうか。 アドバイスお願いします。

    • ベストアンサー
    • MySQL
  • array値を別のテーブルへインサートしたい。

    phpとmysqlを見よう見まねでやっている 初心者です。 atableのチェックボックスよりPOSTした $sample_array(atable.indexの値が複数です。) をbtableへ移動したいと思い、以下の式を自分なりに 考えてみましたが上手くbtableへinsert されません。 atableの複数のindexは選ばれているようですが それをどうしたらbtableへ複数insertできるのか良くわかりません。 何が間違っているのか、atableからbtableへ複数insertできる式を 具体的に書いて頂くと大変助かります。 どうかご教授の程よろしくお願い致します。 $sample_array = $_POST['sample_array']; $where=""; if (isset($sample_array) and is_array($sample_array)) { $where .=" AND atable.index in ("; foreach ($sample_array as $key=>$val) { if($key>0) $where .=","; $where .="'" .mysql_real_escape_string($val) . "'"; } $where .=")"; } $sql= "select * from atable"; $sql .= " where 1"; $sql .= $where; $result = mysql_query( $sql ); while ( $row = mysql_fetch_array( $result ) ) { $sql = "insert into btable (a_no,b_no,c_no) values ('" . $row['no_a'] . "', '" . $row['no_b'] . "','" . $row['no_c'] . "')"; }

    • ベストアンサー
    • PHP
  • Mysql サブクエリの使い方

    table_A ---+------ id | count ---+------ 1 | 5 ---+------ 2 | 6 ---+------ 3 | 7 ---+------ table_B ---+----- id | sub_count ---+----- 1 | 2 ---+------ 2 | 2 ---+------ 3 | 5 ---+------ 1 | 3 ---+------ 2 | 4 ---+------ このようなテーブルで table_Aのcountと、table_Bのidでまとめたsub_countの合計が 一致しないidだけを抽出するために、 SELECT table_A.id FROM (SELECT sum(table_B.sub_count) FROM table_B GROUP BY table_B.id) AS B, table_A, table_B WHERE table_A.id = table_B.id AND table_A.count != sum(table_B.sub_cout) と書いてみましたが、うまくいきません。 ERROR 1111 (HY000): Invalid use of group function 何が悪いのでしょうか? mysqlも投稿も初心者です。 よろしくお願いします。

    • ベストアンサー
    • MySQL