電子書籍の厳選無料作品が豊富!

プログラム初心者です

シンプルな掲示板をつくりました

ホームページのトップページに新しく書き込まれたスレッドを表示したいです

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


よろしくお願いします

A 回答 (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するなりする必要はあるかも)

なにか特殊な処理を別途施していたりしませんか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/01/15 12:21

もしこんな感じであれば



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
    • good
    • 0
この回答へのお礼

回答ありがとうございます
やってみたのですが、日付の新しい順になっていますが、スレッドのレスが重複しているものが表示されてしまいました


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

お礼日時:2014/01/14 18:45

#1です。

書きようが悪かったですね。すみまぜん。

> ORDER BY MAX(time) DESC
なぜorderbyに集合関数 ?
取り除くと、どうなりますか?
とは
ORDER BY time DESC
として欲しかったんです。
    • good
    • 0
この回答へのお礼

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

お礼日時:2014/01/12 16:06

> ORDER BY MAX(time) DESC


なぜorderbyに集合関数?
取り除くと、どうなりますか?

列名は工夫して、予約語っぽいものは避けたほうが無難
    • good
    • 0
この回答へのお礼

回答ありがとうございます
ORDER BY MAX(time) DESCこれを削除すると普通にスレッド一覧を表示するだけになりました
新着順でもなくなってしまいました

>なぜorderbyに集合関数?
ここで教えてもらった方法です

テーブル一個でsure_idごとにスレッドを作っています
新着レスがあったらトップで一番上にスレッド一覧を並び替えて同時に最新レスを表示したいです

イメージ的にこんな感じを創造しています
スレッド1タイトル スレッド1の中の最新レス ←これが一番新しい投稿
スレッド2タイトル スレッド2の中の最新レス

お礼日時:2014/01/12 01:43

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す