2

私は次のようなテーブルを持っています

entryid,  roomid
 1           1      
 2          55
 3           1
 4          12
 5           1
 6          44
 7           1
 8           3
 9           1

ここで、roomid = 1 のすべてのエントリを削除し、roomid = 1 から最新の 3 つを残します (1 つのコマンドだけで最適です)。

最終的に entryid: 1 と 3 が削除され、entryid 6、7、9 は残ります (他のすべての roomid はそのまま残ります)。

編集:助けてくれてありがとう。以下に、興味のあるすべての人のために、独自のソリューションを追加しました

それを 1 つのコマンドに組み込む方法について、新しい質問を開始しました。あなたはそこで私を助けるかもしれません。

4

6 に答える 6

2

DELETEORDER BYand句をサポートしているLIMITため、可能です。ただし、DELETEの参照制限と のパラメータにより、LIMIT2 つのクエリが必要です。

SELECT COUNT(*) AS total FROM table  WHERE roomid = 1;
-- run only if count is > 3
DELETE FROM table WHERE roomid = 1 LIMIT total - 3;

これにはおそらく中間技術が必要になることに注意してください。参考までにクエリを表示しました。

于 2010-07-22T19:32:18.167 に答える
1
SET @deleting = (SELECT COUNT(*) FROM tbl WHERE roomid = 1) - 3;
-- run only if @deleting is > 0
PREPARE stmt FROM 'DELETE FROM tbl WHERE roomid = 1 ORDER BY entryid LIMIT ?';
EXECUTE stmt USING @deleting;
于 2010-07-22T19:44:37.690 に答える
1

不要な部屋の ID を一時テーブルに保存し、それに基づいて削除できます。

create temporary table tmpTable (id int);

insert  tmpTable
        (id)
select  id
from    YourTable yt
where   roomid = 1
        and 3 <=
        (
        select  count(*)
        from    YourTable yt2
        where   yt2.roomid = yt.roomid
                and yt2.id > yt.id
        );

delete  
from    YourTable
where   ID in (select id from tmpTable);    

これにより、次の結果が得られます。

ID  roomid
2   55
4   12
5   44
6   1
7   1
8   3
9   1
于 2010-07-22T19:27:22.620 に答える
0

何かのようなもの

delete from TABLE 
where roomid=1 
   and entryid not in 
   (select entryid from TABLE where roomid=1 order by entryid desc limit 0, 3)

うまくいくかもしれません。

于 2010-07-22T19:25:11.927 に答える
0

助けてくれてありがとう..私はそれらをすべてまとめて、今このソリューションを使用しています:)私にとって、このステップは閉じられています。ありがとう。

// Delete older comments from room 1 (keep last 3 left)
// Step 1:
$sql_com = "SELECT id FROM `mytable` WHERE roomid = '1'";
$result = mysql_query ($sql_com); $num_rows = mysql_num_rows($result);       

// Step 2:
if ($num_rows > 3) {
  $sql_com = "SELECT id FROM `mytable` WHERE roomid = '1' ORDER BY id DESC LIMIT 3,1";  
  $result = mysql_query ($sql_com);
  $row = mysql_fetch_array($result, MYSQL_NUM);
}

// Step 3:  
$sql_com = "DELETE FROM `mytable` WHERE roomid = '1' AND id < ".$row[0];
$result = mysql_query ($sql_com);
于 2010-07-23T08:56:11.653 に答える
0

ここにT-SQLの男がいますが、t-sqlでできることは次のとおりです。

SELECT
    *
FROM 
    TABLE A

    LEFT JOIN (SELECT TOP 3 entryID FROM TABLE WHERE roomID = 1 ORDER BY entryID DESC) B
    ON A.entryID = B.entryID 
WHERE       
    A.roomID = 1 AND
    B.entryID IS NULL

次に、select を DELETE TABLE FROM... に置き換えます。

?

于 2010-07-22T19:37:30.180 に答える