2015-11-06 19 views
6

Tôi muốn nhận ngày tạo mới nhất giữa người gửi và người nhận trong bảng của tôi nơi người gửi hoặc người nhận = 002 và sau đó nhóm theo người gửi và người nhận. Cuối cùng, thông báo cho dù thành viên là người gửi hoặc người nhận từ chế độ xem của 002.MYSQL Nhóm ngày tối đa theo hai cột

Đây chỉ là dữ liệu mẫu.

bảng

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 

Kết quả sẽ giống như thế này

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 

Cho đến nay tôi đã cố gắng:

1)

SELECT 
    id, 
    IF(sender <> '002', sender, receiver) AS member, 
    IF(sender <> '002', 'sender', 'receiver') AS type, 
    MAX(create_date) AS max_date 
FROM 
    table 
WHERE 
    sender = '002' OR receiver = '002' 
GROUP BY 
    member 

Đây là kết quả tôi nhận được ở cuối.

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 

Tôi cố gắng để có được dòng mới nhất nhưng không có vấn đề với create_date.

2) Tôi đã thử sử dụng tham gia bên trong.

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 

này hoạt động tốt để lấy kỷ lục hàng mới nhất mà thôi. Nhưng nếu tôi cần truy xuất các hàng với create_date mới nhất nhưng nhóm theo người gửi và người nhận thì sao?

Trả lời

1

Có thể sử dụng một truy vấn phụ để có được danh sách thành viên và các loại với số ngày, sau đó nhận được tối đa từ đó: -

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 là một vấn đề nhỏ. Nếu được yêu cầu thì cần phải tham gia ngược lại với bảng dựa trên thành viên/loại/ngày tạo để có được nó hoặc làm một câu đố với 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

Dưới đây là một cách khủng khiếp không hiệu quả để làm điều đó, nhưng nó sẽ đạt được kết quả chính xác:

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'; 

Nội phụ chọn sẽ tìm thấy bạn create_date mới nhất cho mỗi thành viên tham gia và bên ngoài chọn sẽ thấy rằng hàng cụ thể .

2

Bạn có thể làm điều đó trong một đơn lựa chọn, với một trường hợp

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

Đây là cách để đi nếu bạn không cần 'id'. – vhu

+1

@vhu đúng, tôi đã bỏ lỡ điều đó. Nếu bạn muốn ID, bạn sẽ phải tham gia trở lại điều này. Nếu ID là theo thứ tự như ngày tạo mặc dù, bạn chỉ có thể lấy tối đa (id) là tốt – AdrianBR

Các vấn đề liên quan