【发布时间】:2013-06-13 05:24:48
【问题描述】:
我正在尝试从表中进行 SQL 查询, - 从所有以用户 36 作为发件人或收件人的用户对获取最后一条消息,并将它们与用户表连接以获取名称。我已经设法创建了这样的东西,但仍然想问是否有更简单的 |有效的解决方案。 Mysql 版本 - 5.5.31
table: messages
fields:
sender_user_id, recipient_user_id, date, text
查询:
SELECT
*
FROM
(SELECT
(CASE sender_user_id > recipient_user_id
WHEN true THEN CONCAT(recipient_user_id, '|', sender_user_id)
WHEN false THEN CONCAT(sender_user_id, '|', recipient_user_id)
END) as hash,
sender_user_id,
recipient_user_id,
date,
text,
u.first_name
FROM
fed_messages
LEFT JOIN fed_users as u ON ((fed_messages.sender_user_id = 36 AND fed_messages.recipient_user_id = u.id) OR (fed_messages.recipient_user_id = 36 AND fed_messages.sender_user_id = u.id))
WHERE
sender_user_id = 36 OR recipient_user_id = 36
ORDER BY date DESC) as main
GROUP BY hash;
谢谢。 更新。来自示例消息表的数据:
mysql> SELECT id, sender_user_id, recipient_user_id, text, date FROM federation.fed_messages WHERE id > 257;
-----+----------------+-------------------+-----------------+---------------------+
| id | sender_user_id | recipient_user_id | text | date |
+-----+----------------+-------------------+-----------------+---------------------+
| 258 | 40 | 36 | and one more | 2013-06-06 10:57:17 |
| 259 | 36 | 38 | another message | 2013-06-06 11:03:49 |
| 260 | 38 | 36 | some mes | 2013-06-06 12:29:33 |
| 261 | 38 | 36 | message | 2013-06-06 12:29:53 |
| 262 | 36 | 38 | message | 2013-06-06 12:47:26 |
| 263 | 36 | 40 | some message | 2013-06-10 16:22:46 |
结果应该是 ids - 262, 263
【问题讨论】:
-
我假设您只需要每对唯一用户之间的最新答案,其中一个是用户 36。请发布示例数据和您需要的输出,这会让人们更容易来帮助你。
-
见更新。像这样?
-
问题是对 36-40 和 40-36 必须被视为唯一的,因为它们是相同的对应关系