MMember テーブルは、列が、会員番号、会員名です
1 USER1
2 USER2
MJournal テーブルは、列が、会員番号、記事番号、記事です
1 1 Message1
1 2 Message2
2 1 MessageA
2 2 MessageB
2 3 MessageC
という状態のときに、会員別の最新情報一覧を出力したいと思います
1 2 Message1 User1
2 3 MessageC User2
という具合にしたいのですが、1回のSQLで、この状態を作り出すことはできるでしょうか?
要は、キーが複数列あって、その組み合わせでの最大値でデータを抽出したいのです
MySQL4.x といっても、4.0.X と 4.1.X ではだいぶ違う(サブクエリが使えるようになっている)
4.1.X 以降であれば、
SELECT m.会員番号, j.記事番号, j.記事 FROM MMember as M JOIN ( SELECT * FROM MJournal AS j1 WHERE j1.記事番号 = ( SELECT max(j2.記事番号) FROM MJournal AS j2 WHERE j1.会員番号 = j2.会員番号 ) ) AS j USING ( 会員番号 ) ORDER BY m.会員番号
ってとこですか。
4.0 系ならできなくは無いかもしれないけれど、面倒な割にメリットが無いので
2回に分けたほうがよいです。
MySQL 4.0とMySQL 4.1では、サブクエリの実装など、大きな機能差があります。
1.MySQL 4.1以降の場合
select M.会員番号,J.記事番号,J.記事,M.会員名 from MMember as M inner join MJournal as J on M.会員番号=J.会員番号 where 記事番号=(select max(記事番号) from MJournal where 会員番号=M.会員番号) order by M.会員番号
2.MySQL 4.0の場合
(1)作業用の表定義
create temporary table tmp記事 (会員番号 int primary key, max記事番号 int)
(2)作業用の表に、各会員の最新記事の番号を格納
insert into tmp記事 select 会員番号,max(記事番号) from MJournal group by 会員番号
(3)作業用の表を組み合わせて検索
select M.会員番号,J.記事番号,J.記事,M.会員名 from MMember as M inner join tmp記事 as T on M.会員番号=T.会員番号 inner join MJournal as J on T.会員番号=J.会員番号 and T.max記事番号=J.記事番号 order by M.会員番号
おお・・・わかりやすい
前の方同様、サブクエリーの使い方が、非常に面白いです
とても、役に立ちました
ありがとうございます