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 に設定します。true の場合は 1。デフォルトでは 0 です。

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

deleted_toまず、既存のフィールドとフィールドを現在使用しているコードを理解する必要がありdeleted_fromます。新しい列を追加するだけの場合is_deleted、自問する必要があります。このテーブルを読み取るすべてのコードが、この新しいフィールドを参照することを認識していることに満足していますか?

あなたの既存のスキーマから判断すると、メッセージはフィールドに日付を設定することで削除され、フィールドを設定することで元に戻すことができると言えます。このロジックの潜在的な穴は、メッセージが 2 回目に削除された場合にどうなるでしょうか? メッセージが最初にいつ削除されたかを知ることができなくなります。たぶん、これはあなたの目的には問題ありません。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_toフィールドを無視してdeleted_from、メッセージがいつ削除されるかを判断しましょう。これらのフィールドの使用方法がわかりません
  2. わかりやすくするためにフィールドの名前を変更dateしますdate_created
  3. datetimeという名前のフィールドを追加しますdate_updated
  4. bit「ゼロ」にデフォルト設定するという名前のフィールドを追加しますis_deleted(つまり、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 に答える
0

単純に次のようになります。

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