MySQL запрос на получение только самой последней записи - PullRequest
1 голос
/ 03 декабря 2011

Я создаю простой модуль чата, в котором есть два уровня.

  1. Входящие
  2. Диалог

в папке "Входящие". Я хочу перечислитьразговор между мной и другими пользователями и отображение последнего сообщения чата от этого конкретного пользователя.

сообщений (id, идентификатор_пользователя, идентификатор_приемника, сообщение, метка времени)

фиктивные данные

1, 1, 2, "hi there", today

2, 1, 4, "Hey Tommy", yesterday

3, 1, 2, "Wanna meet tonite?", now

Теперь, когда я отображаю список, я хочу просто отобразить два сообщения, одно с идентификатором пользователя - 4 и идентификатором пользователя 2. Но должно отображаться только последнее сообщение с идентификатором пользователя 2.

Как выполнить запрос, еслия могу получить только последнюю строку от конкретного пользователя?

Ответы [ 4 ]

2 голосов
/ 03 декабря 2011
SELECT *
FROM (SELECT *
FROM `messages`
WHERE `user_id` = 1
ORDER BY `timestamp` DESC) TT
GROUP BY TT.`receiver_id`;

Надеюсь, что выше помогает!

1 голос
/ 08 декабря 2011

Это эффективный способ добиться этого:

SELECT M1.* FROM Messages M1 LEFT JOIN Messages M2 
ON M1.ReceiverID = M2.ReceiverID AND M1.Timestamp < M2.Timestamp
WHERE M2.ID IS NULL 
1 голос
/ 03 декабря 2011

Это может работать:

$latest_per_user_id = $this->Message->find('all', array(
    'fields'=>'DISTINCT user_id',
    'order' => 'timestamp DESC'
));

РЕДАКТИРОВАТЬ: Если вам просто нужна информация для одного пользователя, вы можете сделать это:

$latest_msg_by_user = $this->Message->find('first', array(
        'conditions'=>array('user_id'=>$user_id),
        'order' => 'timestamp DESC'
    ));

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

1 голос
/ 03 декабря 2011

Я бы попробовал это так:

$user_id = 2;

$latestmessage = $this->Message->find('first', array(
    'conditions' => array(
        'user_id' => $user_id
    ),
    'order' => 'id DESC'
));
...