【发布时间】:2013-06-19 18:50:19
【问题描述】:
设置
我有一个包含两个表的数据库。其中一个用于收件箱消息 (inbox),另一个用于发件箱消息 (outbox)。它们都有相同的结构和一些记录。
+------------------------------------------------------------+
| inbox |
+------------------------------------------------------------+
| messageID | from | to | messageText | timestamp |
+------------------------------------------------------------+
| 1 | userA | userB | sometext | 2013-06-19 10:30 |
| 2 | userB | userC | sometext | 2013-06-19 10:40 |
| 3 | userC | userA | sometext | 2013-06-19 10:50 |
+------------------------------------------------------------+
和
+------------------------------------------------------------+
| outbox |
+------------------------------------------------------------+
| messageID | from | to | messageText | timestamp |
+------------------------------------------------------------+
| 1 | userA | userC | sometext | 2013-06-19 10:20 |
| 2 | userC | userB | sometext | 2013-06-19 10:30 |
| 3 | userB | userA | sometext | 2013-06-19 10:35 |
+------------------------------------------------------------+
问题
我需要从特定用户的每个对话中选择每条最后一条消息(在这种情况下 - 我想从 userA 的对话中检索每条最后一条消息)在消息所在的任何表中 - 收件箱或发件箱。我已经设法通过以下查询从收件箱和发件箱中为每个对话选择最后一条消息:
SELECT * FROM
(
SELECT from, to, timestamp, messageText, messageID
FROM inbox
WHERE to = 'userA'
ORDER BY timestamp DESC
)
AS tmp_table GROUP BY from
UNION
SELECT * FROM
(
SELECT from, to, timestamp, messageText, messageID
FROM outbox
WHERE from = 'userA'
ORDER BY timestamp DESC
)
AS tmp_table GROUP BY to
ORDER BY timestamp DESC
所以现在我需要检查哪条消息较新 - 收件箱中的消息或发件箱中的消息(当然,如果两个用户之间的两个表中都存在消息)并且只返回最新消息。
或者我的方法可能是彻头彻尾的愚蠢 - 请评论:D 谢谢。
【问题讨论】:
-
老实说,没有理由将这些数据存储在两个单独的表中。
-
我同意@Jessica,一张桌子和担心。尝试添加`limit 1'
-
@Jessica - 是的,我现在 - 我肯定会使用不同的结构,但遗憾的是我坚持使用这个结构,因为“客户”不允许我修改它。
-
@amigura “限制 1”对我有什么帮助?它将从表中返回一行。那不是我的目标。
-
您说您的目标是检索 userA 的最新消息 - 将只是表格中的一行。您想要 每个 用户的最新行吗?
标签: php mysql group-by sql-order-by union