PHP MySQL(4.1)の質問です


テーブル
book_comment

フィールド
comment_id
comment_date(date型)
book_id


テーブル
book_info

フィールド
book_id
book_title他多数


このような2つのテーブルがあります。
本に対してコメントしてもらい、そのたびにデータをbook_commentテーブルに蓄積していきます。2つのテーブルはbook_idで繋がっているとお考え下さい。

-------------
やりたい事
1週間以内にコメントされた数が多い本をソートして抽出したいです。SQL文のみで構いません。
-------------

ちなみにこちらに似たような質問をさせて頂きました。
http://q.hatena.ne.jp/1174088194

よろしくお願いします。

回答の条件
  • 1人2回まで
  • 登録:2007/03/17 21:29:43
  • 終了:2007/03/24 21:30:03

回答(1件)

id:b-wind No.1

b-wind回答回数3344ベストアンサー獲得回数4402007/03/17 21:35:15

ポイント60pt

ほとんど一緒じゃないですか。

SELECT i.book_id, count(*) as comment_count
  FROM book_info AS i JOIN book_comment AS c USING ( book_id )
  WHERE DATE_ADD( CURRENT_DATE() , INTERVAL -7 DAY) < c.comment_date
  GROUP BY i.book_id
  ORDER BY count(*) DESC;
id:tokyosmash

そうなんです、ほとんど同じなんです。

でもcount(*) このような書き方がわからないんですね、全く知識が無いもので。

みなさんの回答はドキュメントとして保存しておいて少しづつ勉強していこうと思ってます。

いつもありがとうございます!


追記:

すみません、1行目がよくわかりません。

count(*) as comment_count

なのですが、count(*)は何を差しているのでしょうか?

2007/03/17 22:22:05
  • id:bonlife
    count(*)はWHERE句で指定された条件に一致する行数です。
    http://dev.mysql.com/doc/refman/4.1/ja/counting-rows.html

    asで comment_count と別名をつけています。
    (こうしておくとPHPで取得した際などに参照しやすいです。)

    オフィシャルマニュアルを一通りだとちょっと大変かもしれませんが、「3.6. 一般的なクエリの例」の部分だけでも目を通してみてはいかがでしょうか。

    http://dev.mysql.com/doc/refman/4.1/ja/examples.html
  • id:b-wind
    > count(*)はWHERE句で指定された条件に一致する行数です。
    ちょっと違う。
    この場合 book_id でグループ化しているので、グループごとの行数になる。
  • id:bonlife
    正確な表現じゃなかったですね。
    反省します。

    (紹介したマニュアルにはGROUP BYと共に使った例もあるので、質問者に伝わることを祈りつつ。)
  • id:kurukuru-neko
    >count(*) as comment_count
    >なのですが、count(*)は何を差しているの
    >でしょうか?

    count(*) or count(1) は
    1.where句の条件で行を抽出
    2.group byはその結果を集計(行数)
    3.order byで結果並び替え(行数)

    comment_countの名前をつけているのに何故
    ORDER BY comment_count DESC
    でないのか疑問??に思ったのかも

    >GROUP BY i.book_id
    >ORDER BY count(*) DESC;

    GROUP BY i.book_id
    HAVING comment_count > X
    ORDER BY comment_count DESC
    LIMIT Y

    ランキングであれば
      コメントの有効最小投票数( X )
      有効数(Y)
    も必要かもしれません。
  • id:tokyosmash
    大変参考になります。
    HAVING comment_count > X
    もぜひ使わせて頂きます。

    USING(book_id)とありますが、実際に運用するデータベースは2つのテーブルのフィールド名がbook_idで統一されていませんでした。

    こちらを参考にして
    http://www.rfs.jp/sb/sql/04/03_4.html

    JOIN book_comment ON book_data.main_id = book_comment.book_id

    これでうまくいきました。
    みなさんいつもありがとうございます。
  • id:kurukuru-neko

    関連するキーは同じ名前を付けた方が
    混乱が少ないです?

    カラムの名前を変更できるなら開発
    初期に統一した方がよい
    alter table book_data change main_id book_id 型
    http://dev.mysql.com/doc/refman/4.1/ja/alter-table.html

    ※:何れの場合も適切に索引を構成していなと
    非常に処理が遅くなります。
    show create table テーブル名
    テーブル定義内容が見れます。





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

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

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

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