php - 从 MySQL 中的多个表中选择唯一记录

标签 php mysql group-by sql-order-by union

设置

我有一个包含两个表的数据库。其中一个用于收件箱消息 (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 谢谢。

最佳答案

只需从每个表中获取前 1 条记录,然后合并结果:

SELECT 'outbox', *
FROM outbox
WHERE `from` = 'userA'
ORDER BY timestamp DESC
LIMIT 1

UNION ALL

SELECT 'inbox', *
FROM inbox
WHERE `from` = 'userA'
ORDER BY timestamp DESC
LIMIT 1

注意事项:

1) 注意 from 周围的反引号。 FROM 是几乎所有 sql 数据库中的保留字,因此如果没有语法错误,您的查询将永远无法工作
2) 注意两个子查询中的硬编码 'inbox''outbox' 字符串 - 它们会告诉您找到的记录来自哪个表。

关于php - 从 MySQL 中的多个表中选择唯一记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17199034/

相关文章:

javascript - 绘制带有小时时间序列的流程图

php - 使用 PHP 通过 REST API 删除 http 方法

php - SQL-Server 'uniqueidentifier' 列类型到 MySQL 的迁移问题

mysql - 在 MySQL 中使用 join 更新并添加新记录表

mysql - 按天分组,填补空白

php - 数据映射器应该如何返回域对象?

python - Django 的 JSON 和 XML fixtures 导致 UnicodeEncodeError

MySQL 更改汇总的最后一行

分组的两列的MySQL计数

MySQL 检索组的最新记录