Получить последнюю запись каждой группы записей - PullRequest
3 голосов
/ 10 мая 2011

Я не знаю, как написать синтаксис SQL для получения последней записи (согласно последнему сообщению и не отвечает).

Мой стол

+-------------------+-----------------------+------+-----+---------+----------------+
| Field             | Type                  | Null | Key | Default | Extra          |
+-------------------+-----------------------+------+-----+---------+----------------+
| notification_id   | mediumint(8) unsigned | NO   | PRI | NULL    | auto_increment |
| user_id           | mediumint(8) unsigned | NO   |     | NULL    |                |
| notification_msg  | text                  | NO   |     | NULL    |                |
| notification_date | int(11) unsigned      | NO   |     | NULL    |                |
| private_message   | tinyint(1) unsigned   | NO   |     | 0       |                |
| has_replied       | tinyint(1) unsigned   | NO   |     | 0       |                |
| reply_id          | mediumint(8) unsigned | NO   |     | 0       |                |
+-------------------+-----------------------+------+-----+---------+----------------+

В основном для каждого многопоточного уведомления, он должен получить последнюю запись каждой записи уведомления и проверить, если has_replied равно 0, если это 0, то он должен вернуть его, чтобы PHP мог прочитать, есть ли уведомление, которое не было ответа. Так вот, он должен возвращаться так (псевдо):

+--------------+-----+-----+
| username     | 1   | 4   |
| username2    | 0   | 2   |
+--------------+-----+-----+

Где указывается второй столбец, был или нет ответ на последнее сообщение.

Мой текущий синтаксис SQL (работает, но не получает последнюю запись и, если она отвечает):

SELECT n.*,
       m.user_id,
       m.username
FROM notifications n
INNER JOIN members m ON n.user_id = m.user_id
WHERE private_message = 1
AND reply_id = 0
ORDER BY has_replied ASC,
         notification_date DESC

Ответы [ 2 ]

1 голос
/ 10 мая 2011
Select m.user_id, m.username
    , N...
From members As M
    Join    (
            Select user_id, Max( notification_id ) As notification_id
            From notifications 
            Group By user_id
            ) As UserLastNotification
        On UserLastNotification.user_id = m.user_id
    Join notifications As N
        On N.notification_id = UserLastNotification.notification_id
Where N.private_message = 1
    And N.reply_id = 0
Order By N.has_replied, N.notification_date Desc

Обратите внимание, что при последнем уведомлении каждого пользователя будет выполняться фильтрация с личным сообщением, для которого значение response_id равно нулю.

0 голосов
/ 10 мая 2011

Простого

LIMIT 1

в конце запроса должно быть достаточно, чтобы вернуть только последнее сообщение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...