我有一個消息系統。如何獲取SQL中最近的行?
threads
+----+-------+
| id | title |
+----+-------+
| PK | TEXT |
+----+-------+
messages
+----+--------------+----------------+-----------+-------------+---------+
| id | from_id | thread_id | sent | parent | message |
+----+--------------+----------------+-----------+-------------+---------+
| PK | FK(users.id) | FK(threads.id) | TIMESTAMP | messages.id | TEXT |
+----+--------------+----------------+-----------+-------------+---------+
recipients
+----+-----------------+--------------+--------+
| id | msg_id | to_id | status |
+----+-----------------+--------------+--------+
| PK | FK(messages.id) | FK(users.id) | ENUM |
+----+-----------------+--------------+--------+
users
+----+---------+
| id | name |
+----+---------+
| PK | VARCHAR |
+----+---------+
本質上,這是在其中一個消息傳送系統:
- 消息線程可以有多個收件人(收件人表)
- 每個消息線程有一個標題(threads.title)
- 每個用戶都有自己的狀態(閱讀,隱藏,未讀)每個消息(recipients.status)
- 每個消息都可以回覆(messages.parent指向其他messages.id)
所以希望我的模式是正確的。
我希望得到所有線程的列表,這表明最近的線程內消息,該消息的作者:
+----------+------------+-----------+--------------+------------------+---------------+-------------------+
| users.id | users.name | thread.id | thread.title | messages.message | messages.sent | recipients.status |
+----------+------------+-----------+--------------+------------------+---------------+-------------------+
問題越來越最近的消息的一部分查詢。鑑於recipients.status = 1表示未讀..忽略用戶現在(這會是一個相對簡單的加入到表的其餘部分...),假設也是我們希望用戶1的主題:
SELECT threads.id, title, message, sent, recipients.status
FROM recipients
JOIN messages
ON messages.id=recipients.msg_id
JOIN threads ON threads.id=messages.thread_id
WHERE recipients.to_id=1
AND recipients.status=1
這讓我看到用戶參與的所有線程中的所有消息。但是,我只需要最近的消息,那就是我卡住的地方。
一個解決方案,我非常不喜歡的(有什麼理由不這樣做呢?)
SELECT *
FROM (
SELECT threads.id, title, message, sent, recipients.status
FROM recipients
JOIN messages
ON messages.id=recipients.msg_id
JOIN threads ON threads.id=messages.thread_id
WHERE recipients.to_id=1
AND recipients.status=1
ORDER BY sent DESC
) a
GROUP BY id
您能通過遞減在message.id做訂單獲取由該用戶創建的最新的最新ID? – SoftwareCarpenter 2014-10-08 22:23:57
需要添加最大(發送)列列表和其他列 – radar 2014-10-08 22:32:13