こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

締切り済みの質問

PHP+MySQLでグループごとの新着データを取得したいです

[tblA]
gid gname
--------------------------
01 | グループ1
02 | グループ2
03 | グループ3

[tblB]
id gid text regdate
--------------------------
01 | 01 | テキスト1 | 20080101
02 | 01 | テキスト2 | 20080304
03 | 02 | テキスト3 | 20080408
04 | 03 | テキスト4 | 20080415
05 | 03 | テキスト5 | 20080421

[結果]
gid gname text regdate
--------------------------
03 | グループ3 | テキスト5 | 20080421
02 | グループ2 | テキスト3 | 20080408
01 | グループ1 | テキスト2 | 20080304

以上のように、tblAとtblBを結合して
同じgidのものからregdateが一番新しいデータを一つずつ
regdateの降順で取得したいです。

select tblA.gid, tblA.gname, tblB.text, max(tblB.regdate)
from tblA, tblB
where tblA.gid = tblB.gid
group by tblB.gid
order by tblB.regdate;
以上のSQL文を実行してみたところ、
かえってきたデータは

gid gname text regdate
--------------------------
03 | グループ3 | テキスト4 | 20080421
02 | グループ2 | テキスト3 | 20080408
01 | グループ1 | テキスト1 | 20080304

でした。

集計せずに全件取得してPHPで重複を取り除く処理をする事も考えましたが
全件だと件数が多く、limitをつけると必要な件数が取れない可能性があります。

この場合、どのように記述するのが正しいのでしょうか。

※SQL文やデータは手打ちで作成しています。
打ち間違えがあるかもしれませんが、実際はエラー等出ていませんので
その点の指摘は不要です。

投稿日時 - 2008-09-25 17:19:10

QNo.4355941

すぐに回答ほしいです

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(2)

ANo.2

2度手間なので質問はきちんとしましょう。

サブクエリが使えない場合はテンポラリをつかいます。
CREATE TEMPORARY TABLE subB SELECT gid,MAX(regdate) AS maxReg FROM tblB GROUP BY gid ;
SELECT tblA.gid,gname,tblB.text,subB.maxReg as regdate FROM tblA
LEFT JOIN subB
ON tblA.gid=subB.gid
INNER JOIN tblB
ON tblB.gid=subB.gid AND tblB.regdate=subB.maxReg
ORDER BY regdate DESC

投稿日時 - 2008-09-26 09:42:35

お礼

ありがとうございます。
結局私の手から離れる事になりました。
回答してくださったのにすみません。

投稿日時 - 2008-09-26 14:22:16

ANo.1

MySQLのバージョンは?

まぁSQLに不慣れな人がよく陥る罠ですね。
サブクエリがつかえるならこんな感じで・・・

SELECT tblA.gid,gname,tblB.text,subB.maxReg as regdate FROM tblA
LEFT JOIN (SELECT gid,MAX(regdate) AS maxReg FROM tblB GROUP BY gid) AS subB
ON tblA.gid=subB.gid
INNER JOIN tblB
ON tblB.gid=subB.gid AND tblB.regdate=subB.maxReg
ORDER BY regdate DESC

投稿日時 - 2008-09-25 18:08:02

お礼

ありがとうございます。
今の環境はサブクエリ使えないんです・・・

バージョンは3.23.58となっていました。
PHPは4.3.11、Apacheは2.0.52でした。

投稿日時 - 2008-09-26 09:20:37

あなたにオススメの質問