みんなの「教えて(疑問・質問)」にみんなで「答える」Q&Aコミュニティ

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

解決済みの質問

2つのテーブルを結合後、グループ化して、並び替えしたい

MySQL5.0を使用しています。
MemberテーブルとMailテーブルを結合した後に、MemberIDが重複しないように、グループ化して、日付が早い順に並び替えたいです。
SQL1だと、並べ替えはうまくいくのですが、MemberIDが重複して表示されるので、SQL2に変更して実行すると結果がうまく表示されません。
ここで行き詰ってしまい、とても困っています。
ご存知の方、どうかご教授いただけませんでしょうか?
どうかよろしくお願い致します。
【SQL1】
SELECT * FROM `Member` left join `Mail` on `id` = `ReceiveId` where `Member_Status` = '3' and `OpID` = 'suzuki' order by `Date` desc


【SQL2】
SELECT * FROM `Member` left join `Mail` on `id` = `ReceiveId` where `Member_Status` = '3' and `OpID` = 'suzuki' group by `MemberID`order by `Date` desc

【Member】
+----------+-----------+------------+---------------+
| MemberID | OpID | MemberName | Member_Status |
+----------+-----------+------------+---------------+
| hanako | suzuki | 花子 | 3 |
| taro | suzuki | 太郎 | 3 |
| kana | yamaguchi | かな | 3 |
| ichiro | suzuki | 一郎 | 3 |
| jiro | suzuki | 次郎 | 2 |
| ai | suzuki | 愛 | 3 |
+----------+-----------+------------+---------------+


【Mail】
+---------+---------------------+-----------+-------+------------+------------+
| IndexNo | Date | Title | Body | TransId | ReceiveId |
+---------+---------------------+-----------+-------+------------+------------+
| 1 | 2009-04-02 15:27:59 | タイトル1 | 本文1 | aaaa | hanako |
| 2 | 2009-04-02 02:07:47 | タイトル2 | 本文2 | bbbb | ai |
| 3 | 2009-04-02 00:38:31 | タイトル3 | 本文3 | ssss | taro |
| 4 | 2009-03-30 14:10:38 | タイトル4 | 本文4 | dddd | jiro |
| 5 | 2009-03-20 09:25:41 | タイトル5 | 本文5 | gggg | hanako |
| 6 | 2009-03-19 00:27:42 | タイトル6 | 本文6 | vvvv | ai |
| 7 | 2009-03-16 11:54:15 | タイトル7 | 本文7 | ffff | ichiro |
+---------+---------------------+-----------+-------+------------+------------+

【望む結果】

+----------+-----------+------------+---------------+---------+---------------------+-----------+-------+----------+------------+
| MemberID | OpID | MemberName | Member_Status | IndexNo | Date | Title | Body | TransId | ReceiveId |
+----------+-------------+------------+---------------+---------+---------------------+---------+-------+----------+------------+
| hanako | suzuki | 花子 | 3 | 1 | 2009-04-02 15:27:59 | タイトル1 | 本文1 | aaaa | hanako |
| ai | suzuki | 愛 | 3 | 2 | 2009-04-02 02:07:47 | タイトル2 | 本文2 | bbbb | ai |
| taro | suzuki | 太郎 | 3 | 3 | 2009-04-02 00:38:31 | タイトル3 | 本文3 | ssss | taro |
| ichiro | yamaguch | 一郎 | 3 | 7 | 2009-03-16 11:54:15 | タイトル7 | 本文7 | ffff | ichiro |
+----------+-----------+------------+---------------+---------+---------------------+-----------+-------+----------+------------+

投稿日時 - 2009-04-02 18:13:57

QNo.4847312

すぐに回答ほしいです

質問者が選んだベストアンサー

最低限DDLとDMLで矛盾がないようにしてください。
SQL1、SQL2ともに「ID」になってますが「MemberID」ですよね。

で、考え方をかえて「Mail」を結合前にグループ化するのはどうですか。
こんな感じ。
SELECT * FROM `Member` left join
( select * from `Mail` M1
where not exists
( select 1 from `Mail` M2
where M1.`ReceiveId` = M2.`ReceiveId`
and M1.`Date`<M2.`Date` ) ) as M
on `memberid` = M.`ReceiveId`
where `Member_Status` = '3'
and `OpID` = 'suzuki'
order by `Date` desc

投稿日時 - 2009-04-02 23:15:28

お礼

nora1962様

お忙しい中、回答してくださってありがとうございます。
今後、質問するときは内容をよく見直してから投稿します。
nora1962様にいただいたSQLを参考にさせていただき
取得したい結果を得ることができました。
自分では思いつかなかったので、本当に助かりました。
ありがとうございました。

投稿日時 - 2009-04-03 00:19:07

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

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

回答(1)

あなたにオススメの質問