【发布时间】:2014-09-16 18:14:56
【问题描述】:
我有一个消息表,该表包含以下列:
id | fromUserId | toUserId | sentDate | readDate | message | subject | fromUserDeleted(bit) | toUserDeleted(bit)
现在我需要在每次转换中选择第一条消息,无论它来自当前用户还是发往当前用户。更复杂的是,我需要排除当前用户删除的消息,因此如果消息来自当前用户,则 fromUserDeleted 必须为 0,如果消息来自另一个用户,则 toUserDeleted 必须为 0。
我知道已经有很多关于如何在群组中选择第一个帖子的示例,但这有点复杂。当前用户可能在 toUserId 或 fromUserId 中,删除的列也是如此。
这是我尝试过的:
SELECT
m1.*,
(SELECT count(*) FROM mail m3 WHERE m3.fromUserId=m1.fromUserId AND m3.toUserId=m1.toUserId AND m3.toUserDeleted = 0) as messageCount,
(SELECT count(*) FROM mail m4 WHERE m4.toUserId=15 AND m4.readDate is null AND m4.toUserDeleted=0) as messagesNotRead
FROM
mail m1
LEFT JOIN mail m2 ON
((m1.fromUserId = m2.fromUserId) and
m2.)
WHERE
m2.id IS NULL AND
(m1.toUserId = 15 OR m1.fromUserId = 15)
ORDER BY
m1.sentDate DESC;
还有:
SELECT
*
FROM
mail m1
WHERE
((m1.fromUserId = 15 AND m1.fromUserDeleted=0) OR (m1.toUserId = 15 AND m1.toUserDeleted=0)) AND
m1.id = (SELECT m2.id FROM mail m2 WHERE m2.fromUserId = 15 OR m2.toUserId = 15 OR m2.fromUserId = m1.fromUserId OR m2.fromUserId = m1.toUserId OR m2.toUserId = m1.fromUserId OR m2.toUserId = m1.toUserId order By m2.sentDate desc limit 0,1)
Order by m1.sentDate DESC
这些都不能满足我的需要。请帮忙!
如果需要创建存储过程也没关系。
重要提示:这是我的 MySQL
编辑1:
【问题讨论】:
-
你能用测试数据和数据库结构准备一个 sql fiddle 吗?还包括您想要为该数据获得的理想结果。更好,如果它是最小的,包括所有可能的情况。
-
只有 SendDate 重要,而 readDate 对查询不重要?
-
@user4035 我会试试的。
-
@Rajesh readData 大多数都在选择中,但它不适合选择逻辑。
-
什么是“消息”。如果您的 ID 列是自动递增的,并且邮件可能是正文并且在收件人/收件人之间发生变化,那么标识该邮件 ID 序列 5 的内容是来自原始邮件 ID 2 的响应。主题是否可以像电子邮件一样更改通过转发和回复?这将打破这方面的共同点。
标签: mysql sql stored-procedures join