1

私は2つのテーブルを持っています:

テーブルgroupMessageはレコード グループ ユーザー メッセージに使用されます

テーブルgroupMessageNumは、メッセージ数が 300 を超えるレコードに使用されます。

 -------------------
 | groupMessage    |
 |-----------------|
 |     id          |
 |    hostId       |
 |    roomId       |
 ===================


 ---------------------
 | groupMessageNum   |
 |-------------------|
 |     id            |
 |    hostId         |
 |    roomId         |
 =====================

のレコードを削除しようとしてgroupMessageいます。groupMessageNumまた、 のレコードも削除しようとしていgroupMessageNumます。

削除件数がgroupMessage300件を超える場合は、300件目以降を削除させていただきます。

私のSQLは:

delete group, groupNum from groupMessage group, groupMessageNum
groupNum where group.hostId = groupNum.hostId and group.roomId =
groupNum.roomId;

これにより、groupMessage のすべてのレコードが削除されます。

では、どうすれば 300 番目以降のレコードのみを削除できますか?

例:

100 人のユーザーがいて、60 人のユーザーが 300 を超えるメッセージを持っています。すべてのユーザー メッセージは groupMessage テーブルにあります。メッセージが 300 を超えているため、60 人のユーザー ID が groupMessageNum に含まれています。

今、私は 300 番目のメッセージ以降にあるユーザーのメッセージを削除しようとしています。したがって、最初に groupMessageNum テーブルでユーザー ID を見つけてから、groupMessage テーブルでそれらのメッセージを削除します。

4

2 に答える 2

2

次のようなことを試すことができます:

DELETE group, groupNum
FROM groupMessage group
     INNER JOIN (SELECT hostId 
                 FROM group 
                 ORDER BY msgTime ASC 
                 LIMIT 300, 9999999999
                ) group2
         ON group.hostId = group2.hostId
     INNER JOIN groupMessageNum groupNum
         ON group.hostId = groupNum.hostId AND
            group.roomId = groupNum.roomId;

または、これを試す別の方法:

DELETE group, groupNum
FROM groupMessage group
     INNER JOIN (SELECT hostId, (@rank := @rank + 1) AS rank
                 FROM group, (SELECT @rank:= 0) a
                 ORDER BY msgTime ASC 
                ) group2
         ON group.hostId = group2.hostId AND
            rank > 300
     INNER JOIN groupMessageNum groupNum
         ON group.hostId = groupNum.hostId AND
            group.roomId = groupNum.roomId;
于 2012-08-17T04:52:28.377 に答える
0
DELETE A, B
FROM groupMessage A
INNER JOIN groupMessageNum B on A.hostId = B.hostId and A.roomId=B.roomId
INNER JOIN (SELECT id FROM groupMessage LIMIT 300,999999) C
ON A.id = B.id  
于 2012-08-17T04:43:08.197 に答える