新着表示の問題について

このQ&Aのポイント
  • 質問者は、自身が作成したシンプルな掲示板において、ホームページのトップページに新しく書き込まれたスレッドを表示したいと考えています。
  • 現在、質問者はbbsテーブルに行番号を付けてどんどんインサートしており、トップページはindex.phpです。
  • 質問者が実行したSQLクエリにおいて、新着順に表示するよう指定しているが、実際には古い日付の書き込みが取得されてしまっているため、正しい結果が得られないという問題が発生しています。
回答を見る
  • ベストアンサー

新着表示

プログラム初心者です シンプルな掲示板をつくりました ホームページのトップページに新しく書き込まれたスレッドを表示したいです bbsに書き込まれたらbbsテーブルに行番号を付けてどんどんインサートしていくようにしてます トップページはindex.phpです id (オートインクリメントでつけた行番号) sure_id (タイトルごとのid。これでタイトルごとにまとめています) mes 書き込まれた文章 name 書いた人の名前 time 型はdatetimeです(書き込まれた日付) bbs番号3番のスレ 2番目の書き込み 2013-09-12←これが新着で取得したい値 1番目の書き込み 2013-09-10←なぜかこちらを取得してしまう 下記のようにindex.phpで表示したいです bbs番号3番のスレが2013-09-12 しかしやってみたら新着順にはなるものの3番目のレスの古いほうから値を取得していました SELECT * FROM bbs GROUP BY sure_id ORDER BY MAX(time) DESC LIMIT 1,10 bbs番号3番のスレが2013-09-10 bbs番号5番のスレが2013-09-11 bbs番号6番のスレが2013-09-09 こうなるようにしたいです bbs番号3番のスレが2013-09-12 ←最新の書き込まれたスレッドのなかから一番新しい日付を表示したい bbs番号5番のスレが2013-09-11 bbs番号6番のスレが2013-09-09 よろしくお願いします

  • flash0
  • お礼率97% (297/306)
  • MySQL
  • 回答数4
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

はて?おかしいですね サブクエリの部分 select sure_id,max(dt) from bbs group by sure_id だけ実行すると 1 2014-01-04 19:19:45 2 2014-01-12 01:37:03 5 2014-01-04 18:30:47 6 2014-01-03 19:02:26 が返ってきますよね? であればそれで絞り込んでいるので重複がでるはずがないのですが・・・ (完全にスレッド番号と日時が同じであればダブるのでその場合は distinctするなりする必要はあるかも) なにか特殊な処理を別途施していたりしませんか?

flash0
質問者

お礼

すいません。テーブル名を変更してテストしてみたんですが半分だけテーブル名を変更してませんでしたorz 訂正したらうまくいきました。ありがとうございました(_ _)

その他の回答 (3)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.3

もしこんな感じであれば create table bbs(id int not null primary key auto_increment,sure_id int,mes text,name varchar(20),dt datetime); insert into bbs(sure_id,mes,name,dt) values( 2,'・・・','名無しさん','2014-01-03 19:00:29'),( 6,'・・・','名無しさん','2014-01-03 19:02:26'),( 2,'・・・','名無しさん','2014-01-03 19:19:45'),( 5,'・・・','名無しさん','2014-01-04 18:30:47'),( 1,'・・・','名無しさん','2014-01-04 19:19:45'),( 2,'・・・','名無しさん','2014-01-11 23:03:08'),( 2,'・・・','名無しさん','2014-01-12 01:37:03'); スレッドごとの最新日付順の表示はこう select * from bbs where (sure_id,dt) in( select sure_id,max(dt) from bbs group by sure_id ) order by dt desc

flash0
質問者

お礼

回答ありがとうございます やってみたのですが、日付の新しい順になっていますが、スレッドのレスが重複しているものが表示されてしまいました 7 2 ・・・ 名無しさん 2014-01-12 01:37:03 6 2 ・・・ 名無しさん 2014-01-11 23:03:08 4 5 ・・・ 名無しさん 2014-01-04 18:30:47 3 2 ・・・ 名無しさん 2014-01-03 19:19:45 2 6 ・・・ 名無しさん 2014-01-03 19:02:26 1 2 ・・・ 名無しさん 2014-01-03 19:00:29 下記のものと同じような結果になってしまいました。なかなか難しいです SELECT * FROM bbs ORDER BY dt DESC LIMIT 10 理想はこんな感じです。スレッドごとに書き込まれた最新の名前とレスを取得できればと思っています(最初のid番号は表示しないのでバラバラでも関係ないです) 7 2 ・・・ 名無しさん 2014-01-12 01:37:03 4 5 ・・・ 名無しさん 2014-01-04 18:30:47 2 6 ・・・ 名無しさん 2014-01-03 19:02:26 もしくはこんなかんじです(最新の10件の中でスレッドごとにまとまっている) 7 2 ・・・ 名無しさん 2014-01-12 01:37:03 6 2 ・・・ 名無しさん 2014-01-11 23:03:08 3 2 ・・・ 名無しさん 2014-01-03 19:19:45 1 2 ・・・ 名無しさん 2014-01-03 19:00:29 4 5 ・・・ 名無しさん 2014-01-04 18:30:47 2 6 ・・・ 名無しさん 2014-01-03 19:02:26

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.2

#1です。書きようが悪かったですね。すみまぜん。 > ORDER BY MAX(time) DESC なぜorderbyに集合関数 ? 取り除くと、どうなりますか? とは ORDER BY time DESC として欲しかったんです。

flash0
質問者

お礼

ORDER BY time DESC にしてみたのですがうまくいきませんでした。 SELECT * FROM bbs GROUP BY user_id ORDER BY time DESC LIMIT %d スレッド5 名無しさん 2014-01-04 18:30:47 ←古いスレッドが上にきました スレッド6 名無しさん 2014-01-03 19:02:26 ←古いスレッドが上にきました スレッド2 名無しさん 2014-01-03 19:00:29 ←このスレッドが最新の日付でなくなっている グループもはずしてみると日付の新しい順になりますが、重複が出てしまいます SELECT * FROM bbs ORDER BY time DESC LIMIT 10 グループをはずしてみると最新順になりますがこんな結果になります スレッド2 名無しさん 2014-01-12 01:37:03 ←この最新の日付で表示したい スレッド2 名無しさん 2014-01-11 23:03:08 ←ダブっている(これを非表示) スレッド1 名無しさん 2014-01-04 19:19:45 スレッド2 名無しさん 2014-01-03 19:19:45 ←ダブっている(これを非表示) こんな結果にしたい スレッド2 名無しさん 2014-01-12 01:37:03 ←この最新の日付で表示したい スレッド1 名無しさん 2014-01-04 19:19:45 こうゆう表示ができるならこれでもいいです(最新の10件以内に連続してスレッドごとにまとまっている) スレッド2 名無しさん 2014-01-12 01:37:03 ←この最新の日付で表示したい スレッド2 名無しさん 2014-01-11 23:03:08 ←ダブっているけどスレッドごと スレッド2 名無しさん 2014-01-03 19:19:45 ←ダブっているけどスレッドごと スレッド1 名無しさん 2014-01-04 19:19:45

  • bin-chan
  • ベストアンサー率33% (1403/4213)
回答No.1

> ORDER BY MAX(time) DESC なぜorderbyに集合関数? 取り除くと、どうなりますか? 列名は工夫して、予約語っぽいものは避けたほうが無難

flash0
質問者

お礼

回答ありがとうございます ORDER BY MAX(time) DESCこれを削除すると普通にスレッド一覧を表示するだけになりました 新着順でもなくなってしまいました >なぜorderbyに集合関数? ここで教えてもらった方法です テーブル一個でsure_idごとにスレッドを作っています 新着レスがあったらトップで一番上にスレッド一覧を並び替えて同時に最新レスを表示したいです イメージ的にこんな感じを創造しています スレッド1タイトル スレッド1の中の最新レス ←これが一番新しい投稿 スレッド2タイトル スレッド2の中の最新レス

関連するQ&A

  • 新着順に表示

    プログラム初心者です シンプルな掲示板をつくりました ホームページのトップページに新しく書き込まれたスレッドを表示したいです 状況を説明します bbsに書き込まれたらbbsテーブルに行番号を付けてどんどんインサートしていくようにしてます トップページはindex.phpです index.php(トップページ) mysqli(手続き型)のカラム bbsテーブル id (オートインクリメントでつけた行番号) bbs_id (タイトルごとのid。これでタイトルごとにまとめています) title スレタイトル mes 書き込まれた文章 name 書いた人の名前 time 型はdatetimeです(書き込まれた日付) 例えば、下記のように書き込まれたら 新しい書き込みがbbs番号3番のスレが2013-09-10 12:10:00 新しい書き込みがbbs番号5番のスレが2013-09-10 12:00:00 だとしたら 3番のスレへのリンク 5番のスレへのリンク のようにトップにスレへのリンクを書き込みが新しい順に20くらい表示したいです よろしくお願いします

    • ベストアンサー
    • MySQL
  • 削除ふらぐ

    プログラム初心者です phpとmysqlで簡単な掲示板を作りました 一つのテーブルでsure_idごとにスレッドをつくり、resu_idでレス番号をつくっています そこで削除フラグがある場合にはそのレスを表示しないようにしたいのです 素人なのでこんな方法しか思い浮かばないのですがこれで大丈夫でしょうか? 5番のスレッドを全て取得し、削除フラグがない行を全て取得 SELECT * FROM bbs WHERE sure_id=5 and dll_flg=0 質問1 削除フラグはどのような立て方が良いでしょうか?0と1でしょうか? 質問2 削除フラグのカラムにもインデックスを張ったほうが速いですか? 質問3 phpでいちいちif文で判定するよりsqlで表示判定したほうが早いですよね? よろしくお願いします

    • ベストアンサー
    • MySQL
  • group byで最後のレコードを抽出したい

    group byで特定のカラムをまとめる際に、最後(最新)のレコードを抽出したいのですが 最初(古い)の行が抽出されてしまいます。 例えば、threadカラムとuptimeカラムがあるテーブルBBSで threadカラムをgroup byでまとめる際にuptimeの降順(desc)でまとめたい場合 どのようにしたらいいでしょうか? 【テーブルBBS】 id thread uptime 1 1 1230100000 2 2 1230200000 3 1 1230300000 4 3 1230400000 5 1 1230500000 6 2 1230600000 select * form bbs group by thread order by uptime desc だと thread uptime 3 1230400000 1 1230300000 2 1230200000 になってしまいます。 次のような結果を表示するにはどのようにしたらいいでしょうか。 thread uptime 2 1230600000 1 1230500000 3 1230400000 また、DISTINCTを使うと同じフィールド内に重複したレコードがある場合は最初のレコードのみ表示されますが、最後のレコードのみ表示するにはどのようにすればいいのでしょうか? よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • ホスト名を表示するには

    たぶんこの行と思うのですが、dat内容を表示するにはどのように修正すればよいのでしょうか #スレッドの投稿ログを開く open(FH,"../$_[0]/dat/$sure_id.dat"); dat内容は以下のとおりです。(ホスト名を取得するまでは、投稿内容でdatは終わってました) 投稿名</b> ★<b><><>04/3/6 22:42 ID:***<>投稿内容<>ホスト名<>

  • 2チャンネル スレッドについて

    2ちゃんねるのスレッドによっては、名無しさん@お腹いっぱい。:2001/04/22(日) 00:00 ID:xxxxxxxxのIDxxxxxxxxの部分が表示されているスレとされていないスレがありますが、どこの設定でIDの表示、非表示が決まるのでしょうか?スレを立てた人がID表示を選択出来るのでしょうか?

  • NEWマークをPHPで表示させたい

    掲示板で新たに書き込みがあると、トップページにNEW!マークを表示させようとしています。 トップページが、PHPですのでPHPでコードを探していたところ、 掲示板が更新されたらnewマークを付ける : Everyday, "Albi"day! nagisa.skr.jp/archives/2011/02/02_1437.html というサイトがあったので、参考にさせていただきました。 <?php $mod = filemtime("---"); //更新を取得したいファイルまでのパス $Time1 = 24; // 時間差、単位はhour  この時間の間だけアイコンを表示する $gifname = "---"; //new画像までのパス $timediff = time() - $mod; if ( $timediff < 60*60*$Time1 ) { $outl = " <img src=" . $gifname . " alt=new />\n"; print $outl; } else { print ""; } ?> とあり、利用させていただいたのですがうまくいきません。(ページが真っ白になります) そもそも、filemtimeは同じサーバー内の別ドメインのファイルの更新時間を取ってこれるのでしょうか ../../../../example.example.net/httpdocs/bbs/i/index.htmlという記載で問題ないのでしょうか どなたかご教授願います。

  • 行数の取得

    mysql初心者です 行数を取得したいです 処理をすこしでも軽くしたいです このように書くとテーブルの中身は見に行かないらしいのですが SELECT COUNT(*) AS cnt FROM bbs WHEREをつけると中身を見に行きますか? SELECT COUNT(*) AS cnt FROM bbs WHERE sure_id=5 中身を見に行く場合、カラムを指定したほうが早いでしょうか? SELECT COUNT(id) AS cnt FROM bbs WHERE sure_id=5 よろしくお願いします

    • ベストアンサー
    • MySQL
  • 2チャンネルでのレスについて?

    レスした場合 日付だけが表示される場合と 日付とIDが表示される場合があるようです。 また、日付とIDの横に更に[ ]があって その中にプロバイダ名がわかるような表示がされている 場合があるようです。 どのスレでもプロバイダ名はわかってしまうもの なのでしょうか? ただ、スレによってそれを表示してないだけなの でしょうか? 見る人が見ればわかってしまうものでしょうか? わかりにくい質問かと思いますが どなたかよろしくお願いします。

  • 【2ちゃんのID】

    閲覧ありがとうございます。 2ちゃんでの、ID表示されるスレについての質問です。 昨日、よく書き込んでいるスレに書き込みをしたら数時間前に全く同じIDで書き込みをしている人がいました。 (書き込みをしたのは24日付けです。) 私は昨日(24日)1度しか書き込みをしていないのに既に3回も書き込みをしたように見えるので一体何のためのIDなんだ?と疑問に思ってしまいました(‥;) IDが被るってよくあることなんですか?

  • 番号を付けたい

    プログラム初心者です phpとmysqlで簡単な掲示板を作りました カラムは sure、title、text、time、name selectで同じスレ名をselectします それで取得できたのがこんなかんじになります スレ名(sure) タイトル(title) テキスト(text) 書き込まれた時間(time) 書き込んだ人の名前(name) タイトル(title) テキスト(text) 書き込まれた時間(time) 書き込んだ人の名前(name) このレス一覧に番号を振る方法を教えてください こんな感じにしたいです NO2 タイトル(title) テキスト(text) 書き込まれた時間(time) 書き込んだ人の名前(name) NO1 タイトル(title) テキスト(text) 書き込まれた時間(time) 書き込んだ人の名前(name) よろしくお願いします

    • ベストアンサー
    • MySQL