人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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程度用意しています。


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

●質問者: tokyosmash
●カテゴリ:インターネット ウェブ制作
✍キーワード:MySQL PHP point クエリ ソート
○ 状態 :終了
└ 回答数 : 2/2件

▽最新の回答へ

1 ● Mook
●300ポイント ベストアンサー

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

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

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

ご参考までに。


2 ● b-wind
●200ポイント
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 日付と時刻関数

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ