1

嗨,我有我的消息表,我想知道如何添加消息 is_deleted 由用户这里是我的表:

id fromid toid message is_read deleted_to deleted_from  date
1  1      2    test1   1       0          0             2012-09-06 00:00:10
2  2      1    test2   1       0          0             2012-09-06 00:00:11
3  1      3    test3   1       0          0             2012-09-06 00:00:12
4  3      1    test4   1       0          0             2012-09-06 00:00:13
5  2      1    test5   1       0          0             2012-09-06 00:00:14


Users
MemberID    username
1           user1
2           user2
3           user3

我应该怎么做才能不选择已删除的消息?我的表是正确的还是我需要添加表并在我的查询中有条件?

例如:用户给我发了一条消息,我已经删除了这条消息,现在这条消息在我这边不可见。但是在发送方他可以看到他的消息,如果他还没有删除消息的话。它就像 facebook 消息传递。您可以删除整个对话,也可以只删除选定的消息。

我刚刚创建了我的 mysql 查询:

SELECT 
                IF(derived_messages.toid = '$user', derived_messages.fromid, 
                derived_messages.toid) friend1,c.UserName,
                derived_messages.message, derived_messages.fromid, derived_messages.toid,
                derived_messages.is_read,
                derived_messages.date
                FROM 
                (SELECT * 
                FROM messages
                ORDER BY date desc) derived_messages
                INNER JOIN Users c ON c.MemberID = IF(derived_messages.toid = '$user', derived_messages.fromid, 
                derived_messages.toid)
                WHERE (derived_messages.toid='$user' OR derived_messages.fromid='$user') 
                GROUP BY friend1 ASC 
                ORDER BY derived_messages.date DESC, derived_messages.id DESC

现在,我想知道我要在哪里添加已删除消息的条件。

谢谢。!

4

3 回答 3

1

添加列 is_deleted。为 false 时设置为 0。1 为真。默认为 0。

SELECT message, etc FROM messages WHERE is_deleted = 0;
于 2012-09-10T07:33:57.123 回答
0

它可能只是:

SELECT * 
FROM tableName 
WHERE is_deleted = 0
于 2012-09-10T07:35:25.363 回答
0

首先,您需要了解哪些代码当前正在使用现有的deleted_todeleted_from字段。如果您只是添加一个新列is_deleted,您必须问自己,您是否对所有读取此表的代码都知道查看这个新字段感到满意?

从您现有的模式来看,我会说可以通过为字段设置日期来考虑删除消息,然后通过设置字段来取消删除。这个逻辑中的潜在漏洞是,如果消息被第二次删除会发生什么?您不知道第一次删除邮件的时间。也许这对于您的目的来说是可以的。deleted_fromdeleted_to

我同意添加新字段是可以接受的,is_deleted只要现有字段保持一致状态即可。deleted_todeleted_from

您不希望某些代码使用此逻辑

SELECT * 
FROM tableName 
WHERE is_deleted = 0

和其他使用类似逻辑的代码

SELECT * 
FROM tableName 
WHERE 
    @query_date < deleted_from
    OR @query_date > deleted_to

您最终可能会在确定何时考虑删除邮件时出现不一致的情况。如果有多个应用程序正在读取您的数据库表,这尤其成问题。

根据您的评论进行编辑

好的,为了简单起见,这就是我的建议......

  1. 让我们忽略这些字段deleted_todeleted_from确定何时删除消息。我不确定如何打算使用这些字段
  2. 为清晰起见重命名date要命名的字段date_created
  3. 添加一个datetime名为date_updated
  4. 添加一个bit名为is_deleteddefaulting to "zero" 的字段(即 0 = false,1 = true)

在您的代码中,删除消息时,将 is_deleted 字段设置为 1 (true)。每次编辑或删除记录时都应设置 date_updated 字段。您可以通过检查“is_deleted = 1”并参考“date_updated”字段来确定何时删除记录。

你只查询没有被删除的记录,添加WHERE messages.is_deleted = 0如下图

SELECT 
     IF(derived_messages.toid = '$user', derived_messages.fromid, 
     derived_messages.toid) friend1,c.UserName,
     derived_messages.message, derived_messages.fromid, derived_messages.toid,
     derived_messages.is_read,
     derived_messages.date
FROM (
    SELECT * 
     FROM messages 
     WHERE messages.is_deleted = 0
     ORDER BY date desc
     ) derived_messages
INNER JOIN Users c 
        ON c.MemberID = IF(derived_messages.toid = '$user', derived_messages.fromid, derived_messages.toid)  
WHERE 
    (derived_messages.toid='$user' OR derived_messages.fromid='$user')
GROUP BY 
    friend1 ASC 
ORDER BY 
    derived_messages.date DESC, derived_messages.id DESC
于 2012-09-10T07:56:56.650 回答