2015-11-06 8 views
6

Я хочу получить последнюю дату создания между отправителем и получателем в моей таблице, где отправитель или получатель = 002, а затем группа отправителем и получателем. В конце сообщите, является ли элемент отправителем или получателем с точки зрения 002.MYSQL Макс. Группа дат по двум столбцам

Это всего лишь пример данных.

стол

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)

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 

Это результат, который я получил в конце.

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

Возможно использовать вспомогательный запрос, чтобы получить список членов и типов с датами, а затем получить максимум от: -

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 

Идентификатор является второстепенной проблемой. Если требуется, то он должен присоединиться обратно к столу на основании члена/типа даты/создать, чтобы получить его, или сделать скрипку с 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'; 

Inner югу выберите подберут вам последнюю 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, я пропустил это. Если вам нужен идентификатор, вам нужно будет присоединиться к этому. Если идентификатор находится в том же порядке, что и дата создания, вы можете просто взять max (id) – AdrianBR

Смежные вопросы