MySQL4.x で、SQL を書きたいのですが、以下のような条件の時どう描くのが良いでしょうか?


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で、この状態を作り出すことはできるでしょうか?
要は、キーが複数列あって、その組み合わせでの最大値でデータを抽出したいのです

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/12/10 20:05:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答2件)

id:b-wind No.1

回答回数3344ベストアンサー獲得回数440

ポイント35pt

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回に分けたほうがよいです。

id:chuken_kenkou No.2

回答回数722ベストアンサー獲得回数54

ポイント35pt

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.会員番号
id:rikimaru

おお・・・わかりやすい

前の方同様、サブクエリーの使い方が、非常に面白いです

とても、役に立ちました

ありがとうございます

2007/12/05 01:23:07

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません