PHP MySQL(4.1)の質問です


テーブル
book_touhyou

フィールド
touhyou_id
touhyou_date(date型)
book_id
point


テーブル
book_info

フィールド
book_id
book_title
他多数


このような2つのテーブルがあります。
本に対して5段階で投票してもらい、そのたびにデータをbook_touhyouテーブルに蓄積していきます。投票のポイントはpointフィールドに入れます(1,2,3,4,5のどれかを)。2つのテーブルはbook_idで繋がっているとお考え下さい。
-------------
やりたい事
1週間以内に投票されたポイントの総数が高い順に本をソートして抽出したいです。
-------------

どうすればいいのか、全く検討がつきません。まずbook_idごとにpointを集計して、その後クエリすればいいのでしょうけど。。
予算ポイントは500程度用意しています。


みなさんよろしくお願いします。

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2007/03/17 08:36:34
  • 終了:2007/03/17 21:09:06

ベストアンサー

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912007/03/17 10:40:11

ポイント300pt

下記のような感じでしょうか。

一応ランキングテーブルのような表にしてみました。

MySQL 日付と時間関数

<?
// データベース情報
define( "db_Server", "localhost" );
define( "db_User", "foo" );
define( "db_Password", "bar" );
define( "db_Name", "testdb" );

// データベース接続
$conn = mysql_connect( db_Server, db_User, db_Password ) or die("接続エラー");
mysql_select_db(db_Name) or die("DATABASE 選択エラー     :".$dbName );

// クエリ 一週間以内のポイント数順にデータを取得
$sql  = "SELECT i.book_title AS title, i.book_id AS id, SUM(t.point) AS points ";
$sql .= "FROM book_touhyou t, book_info i ";
$sql .= "WHERE i.book_id = t.book_id AND TO_DAYS(NOW()) - TO_DAYS(touhyou_date) <= 7 ";
$sql .= "GROUP BY i.book_title, i.book_id ORDER BY points DESC;";
$res = mysql_query( $sql, $conn ) or die("エリアデータ抽出エラー<br>\n".$sql);
// ヘッダ部分の表示
print <<<_HEAD
<html>
<head></head>
<body>
<center>
投票ポイントランキング<br>
<table border="1">
<tr>
    <td>順位</td>
    <td>書名</td>
    <td>ポイント</td>
</tr>
_HEAD;
$count = 1;
$pre_points = -1;
$pre_num = -1;
while ( $row = mysql_fetch_array( $res, MYSQL_ASSOC ) ) {
    print "<tr>\n";
// 順位の表示
    if ( $pre_points == $row["points"] ) {
        print "<td>".$pre_num."</td>";
    } else {
        print "<td>".$count."</td>";
        $pre_num = $count;
    }
    $pre_points = $row["points"];
    print "<td>".$row["title"]."</td>";   // 書名の表示
    print "<td>".$row["points"]."</td>\n";  // ポイントの表示
    print "</tr>\n";
    $count++;
}
mysql_close( $conn );
print <<<_FOOT
</table>
</center>
</body>
</html>
_FOOT;
?>

ご参考までに。

その他の回答(1件)

id:Mook No.1

Mook回答回数1312ベストアンサー獲得回数3912007/03/17 10:40:11ここでベストアンサー

ポイント300pt

下記のような感じでしょうか。

一応ランキングテーブルのような表にしてみました。

MySQL 日付と時間関数

<?
// データベース情報
define( "db_Server", "localhost" );
define( "db_User", "foo" );
define( "db_Password", "bar" );
define( "db_Name", "testdb" );

// データベース接続
$conn = mysql_connect( db_Server, db_User, db_Password ) or die("接続エラー");
mysql_select_db(db_Name) or die("DATABASE 選択エラー     :".$dbName );

// クエリ 一週間以内のポイント数順にデータを取得
$sql  = "SELECT i.book_title AS title, i.book_id AS id, SUM(t.point) AS points ";
$sql .= "FROM book_touhyou t, book_info i ";
$sql .= "WHERE i.book_id = t.book_id AND TO_DAYS(NOW()) - TO_DAYS(touhyou_date) <= 7 ";
$sql .= "GROUP BY i.book_title, i.book_id ORDER BY points DESC;";
$res = mysql_query( $sql, $conn ) or die("エリアデータ抽出エラー<br>\n".$sql);
// ヘッダ部分の表示
print <<<_HEAD
<html>
<head></head>
<body>
<center>
投票ポイントランキング<br>
<table border="1">
<tr>
    <td>順位</td>
    <td>書名</td>
    <td>ポイント</td>
</tr>
_HEAD;
$count = 1;
$pre_points = -1;
$pre_num = -1;
while ( $row = mysql_fetch_array( $res, MYSQL_ASSOC ) ) {
    print "<tr>\n";
// 順位の表示
    if ( $pre_points == $row["points"] ) {
        print "<td>".$pre_num."</td>";
    } else {
        print "<td>".$count."</td>";
        $pre_num = $count;
    }
    $pre_points = $row["points"];
    print "<td>".$row["title"]."</td>";   // 書名の表示
    print "<td>".$row["points"]."</td>\n";  // ポイントの表示
    print "</tr>\n";
    $count++;
}
mysql_close( $conn );
print <<<_FOOT
</table>
</center>
</body>
</html>
_FOOT;
?>

ご参考までに。

id:b-wind No.2

b-wind回答回数3344ベストアンサー獲得回数4402007/03/17 11:23:32

ポイント200pt
SELECT i.book_id, sum(t.point)
  FROM book_info AS i JOIN book_touhyou AS t USING ( book_id )
  WHERE DATE_ADD( CURRENT_DATE() , INTERVAL -7 DAY) < t.touhyou_date
  GROUP BY i.book_id
  ORDER BY sum(t.point) DESC;

MySQL AB :: MySQL 4.1 リファレンスマニュアル :: 6.3.4 日付と時刻関数

  • id:tokyosmash
    できました!
    2つの回答を頂きましたので、私にとってわかりやすいところをピックアップして混ぜました。

    どうもありがとうございます。思い通りの動きをしてくれています。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません