Сложный запрос MySQL нуждается в предложении

#mysql #group-by #sql-order-by

#mysql #сгруппировать по #sql-order-by

Вопрос:

У меня есть таблица следующего вида:

  id | sender      | receiver    | time 
  1 | felix@a.com | lea@a.com   | 2014-07-04 22:50:16    
  2 | felix@a.com | lea@a.com   | 2014-07-04 22:51:20    
  3 | felix@a.com | mia@a.com   | 2014-07-04 22:51:41    
  4 | mia@a.com   | felix@a.com | 2014-07-04 22:52:45    
  5 | mia@a.com   | felix@a.com | 2014-07-04 22:52:58
  6 | lea@a.com   | felix@a.com | 2014-07-04 22:53:33
  7 | felix@a.com | mia@a.com   | 2014-07-04 22:55:53
  

Я хочу получить отдельного отправителя / получателя, у которого есть запись с ‘felix@a.com ‘ порядок по времени ниже. Итак, результат будет таким, как показано ниже

  id | sender      | receiver    | time
  6 | lea@a.com   | felix@a.com | 2014-07-04 22:53:33
  7 | felix@a.com | mia@a.com   | 2014-07-04 22:55:53
  

Я пытаюсь с этим справиться, но не работает должным образом

 SELECT * 
FROM (
SELECT * 
FROM  `message` 
ORDER BY  `time` DESC
) AS  `message` 
WHERE (
message.sender =  'felix@a.com'
OR message.receiver =  'felix@a.com'
)
GROUP BY message.receiver, message.sender
  

Пожалуйста, укажите мне правильный способ достижения моей цели.

Комментарии:

1. Итак, вам нужна самая последняя строка, где отправитель = felix, и самая последняя строка, где получателем является felix? Вы можете сделать это с помощью UNION.

Ответ №1:

 DROP TABLE my_table;

CREATE TABLE my_table
(id INT NOT NULL PRIMARY KEY
,sender VARCHAR(20) NOT NULL     
,receiver VARCHAR(20) NOT NULL    
,time DATETIME NOT NULL
);

INSERT INTO my_table VALUES
(1,'felix@a.com','lea@a.com','2014-07-04 22:50:16'),
(2,'felix@a.com','lea@a.com','2014-07-04 22:51:20'),
(3,'felix@a.com','mia@a.com','2014-07-04 22:51:41'),
(4,'mia@a.com','felix@a.com','2014-07-04 22:52:45'),
(5,'mia@a.com','felix@a.com','2014-07-04 22:52:58'),
(6,'lea@a.com','felix@a.com','2014-07-04 22:53:33'),
(7,'felix@a.com','mia@a.com','2014-07-04 22:55:53');

(SELECT * FROM my_table WHERE sender = 'felix@a.com' ORDER BY time DESC LIMIT 1)
UNION
(SELECT * FROM my_table WHERE receiver = 'felix@a.com' ORDER BY time DESC LIMIT 1);
 ---- ------------- ------------- --------------------- 
| id | sender      | receiver    | time                |
 ---- ------------- ------------- --------------------- 
|  7 | felix@a.com | mia@a.com   | 2014-07-04 22:55:53 |
|  6 | lea@a.com   | felix@a.com | 2014-07-04 22:53:33 |
 ---- ------------- ------------- --------------------- 
  

Комментарии:

1. Спасибо @Strawberry, это будет работать только для приведенных выше входных данных. Что произошло, когда ‘felix@a.com ‘ отправляет или получает многим пользователям или от многих пользователей?

2. Если вопрос изменится, то ответ тоже может измениться.

Ответ №2:

 SELECT DISTINCT sender, receiver
FROM tablename ORDER BY time DESC;
  

Этот пример предложения SQL DISTINCT вернул бы каждую уникальную комбинацию отправителя и получателя. В этом случае DISTINCT применяется к каждому полю, указанному после ключевого слова DISTINCT.

Комментарии:

1. Спасибо, но это не дает желаемого результата