2015-11-06 8 views
6

送信者または受信者= 002の送信者と受信者の間で最新の作成日を取得し、次に送信者と受信者によってグループ化します。最後にメンバーが送信者か受信者かを002で確認してください。MYSQL最大2つの列の日付グループ

これは単なるサンプルデータです。

テーブル

id sender | receiver |  create_date 
1  001    002   2015-10-13 10:30:01 
2  003    002   2015-11-06 15:30:59 
3  001    002   2015-11-02 05:30:01 
4  001    002   2015-11-03 11:08:22 
5  002    004   2015-10-20 12:15:36 
6  002    004   2015-11-03 17:35:10 
7  002    005   2015-09-01 06:02:20 
8  002    001   2015-11-06 15:10:32 

結果はこれまでのところ、私が試してみました。この

id | member | type |  create_date 
2   003   sender  2015-11-06 15:30:59 
6   004   receiver  2015-11-03 17:35:10 
7   005   receiver  2015-09-01 06:02:20 
8   001   receiver  2015-11-06 15:10:32 

次のようになります。

1)

これは私が最後に得た結果です。

id | member | type |  create_date 
1   001   sender  2015-11-06 15:10:32 
2   003   sender  2015-11-06 15:30:59 
5   004   receiver  2015-11-03 17:35:10 
7   005   receiver  2015-09-01 06:02:20 

私は、最新の現在の行が、CREATE_DATEと問題なしを取得するために苦労しています。

2)私は内部結合も試みました。

SELECT 
    * 
FROM 
    table a 
INNER JOIN 
(
    SELECT 
     id, 
     MAX(create_date) as max_date 
    FROM 
     table 
    WHERE 
     sender = '002' OR receiver = '002'   
) b ON b.max_date = a.create_date 

これは、最新の行レコードのみを取得する場合に有効です。しかし、最新のcreate_dateで行を取得する必要があるが、送信者と受信者でグループ化する必要がある場合はどうすればよいでしょうか?ここで

答えて

1

はおそらく日付を持つメンバーとタイプのリストを取得するには、サブクエリを使用した場合と、1つの選択でそれを行うことができ、そのから最大を得る: -

SELECT member, type, MAX(create_date) 
FROM 
(
    SELECT sender AS member, 'sender' AS type, create_date 
    FROM table 
    WHERE receiver = '002' 
    UNION 
    SELECT receiver AS member, 'receiver' AS type, create_date 
    FROM table 
    WHERE sender = '002' 
) sub0 
GROUP BY member, type 

idは小さな問題です。必要であれば、それはメンバー/タイプに基づいてテーブルに対してバックに参加する必要がある/それを得る、またはGROUP_CONCATとフィドルを行うには、日付を作成します - あなたが必要としない場合

SELECT SUBSTRING_INDEX(GROUP_CONCAT(id ORDER BY create_date DESC), ',', 1), 
     member, 
     type, 
     MAX(create_date) 
FROM 
(
    SELECT id, sender AS member, 'sender' AS type, create_date 
    FROM table 
    WHERE receiver = '002' 
    UNION 
    SELECT id, receiver AS member, 'receiver' AS type, create_date 
    FROM table 
    WHERE sender = '002' 
) sub0 
GROUP BY member, type 
1

はそれを行うには恐ろしく非効率的な方法ですが、それは正しい結果を達成ます:

SELECT id, t.member, COALESCE(IF(sender<>2,'sender',NULL),'receiver') type, t.create_date 
FROM a 
JOIN (
SELECT COALESCE(IF(sender<>2,sender,NULL),receiver) member, MAX(create_date) create_date 
FROM a GROUP BY member 
) t on ((a.sender=t.member or a.receiver=t.member) AND a.create_date=t.create_date) 
WHERE a.sender='002' OR a.receiver='002'; 

インナーサブ選択が関係する各部材と外側の選択のための最新のCREATE_DATEは、その特定の行を見つけるあなたを見つけるだろう。

2

あなたは

select 
case when sender='002' then receiver else sender end as member, -- # knowing that either sender or receiver are 002, take the other. 
case when sender='002' then 'receiver' else 'sender' end as type, 
max(date) 
from table 
where sender = '002' or receiver = '002' 
group by 1,2 
+1

これは移動するための方法であります'id'。 – vhu

+1

@vhu true、私はそれを逃した。 IDが必要な場合は、これに戻って参加する必要があります。 IDが作成日と同じ順番になっている場合は、max(id)も使用できます – AdrianBR

関連する問題