- ベストアンサー
新着表示の問題について
- 質問者は、自身が作成したシンプルな掲示板において、ホームページのトップページに新しく書き込まれたスレッドを表示したいと考えています。
- 現在、質問者はbbsテーブルに行番号を付けてどんどんインサートしており、トップページはindex.phpです。
- 質問者が実行したSQLクエリにおいて、新着順に表示するよう指定しているが、実際には古い日付の書き込みが取得されてしまっているため、正しい結果が得られないという問題が発生しています。
- みんなの回答 (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するなりする必要はあるかも) なにか特殊な処理を別途施していたりしませんか?
その他の回答 (3)
- yambejp
- ベストアンサー率51% (3827/7415)
もしこんな感じであれば 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
お礼
回答ありがとうございます やってみたのですが、日付の新しい順になっていますが、スレッドのレスが重複しているものが表示されてしまいました 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)
#1です。書きようが悪かったですね。すみまぜん。 > ORDER BY MAX(time) DESC なぜorderbyに集合関数 ? 取り除くと、どうなりますか? とは ORDER BY time DESC として欲しかったんです。
お礼
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)
> ORDER BY MAX(time) DESC なぜorderbyに集合関数? 取り除くと、どうなりますか? 列名は工夫して、予約語っぽいものは避けたほうが無難
お礼
回答ありがとうございます ORDER BY MAX(time) DESCこれを削除すると普通にスレッド一覧を表示するだけになりました 新着順でもなくなってしまいました >なぜorderbyに集合関数? ここで教えてもらった方法です テーブル一個でsure_idごとにスレッドを作っています 新着レスがあったらトップで一番上にスレッド一覧を並び替えて同時に最新レスを表示したいです イメージ的にこんな感じを創造しています スレッド1タイトル スレッド1の中の最新レス ←これが一番新しい投稿 スレッド2タイトル スレッド2の中の最新レス
お礼
すいません。テーブル名を変更してテストしてみたんですが半分だけテーブル名を変更してませんでしたorz 訂正したらうまくいきました。ありがとうございました(_ _)