2010-12-03 9 views
5

テーブル内の最初の行を選択し、time(昇順)で並べ替え、その行を削除します。 2つのクエリを使用したくないのは、別のクライアントが削除される前にその行を選択する可能性があるからです(複数のマシンが異なるネットワークから同時に接続されることになります)。SELECTとDELETE

私は

SELECT * FROM `mytable` ORDER BY `time` LIMIT 1; 
    DELETE FROM `mytable` ORDER BY `time` LIMIT 1 

ような何かを行うことができます考えていた...しかし、私はエラーを得た:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '; DELETE * FROM pending ORDER BY time LIMIT 1' at line 1

これを行うための最善の方法は何ですか?ありがとう。あなたのエラーメッセージを再

insert tmpTable 
     (id) 
select id 
from YourTable yt 
order by time limit 1; 

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

答えて

4

(あなたの質問では異なる):

2

あなたは一時テーブルを作成する必要があり、MySQLは、このコードを参照してください、あなたが使用しているテーブルから削除できません。

DELETE * FROM pending ORDER BY time LIMIT 1 

構文に誤りがあります。 *を削除してください。つまり、

DELETE FROM pending ORDER BY time LIMIT 1 

正常に動作するはずです。

+0

tmpTableを後で削除する必要がありますか? –

+1

はい(15文字) –

+0

一時テーブルを明示的に作成する必要はありません。派生テーブル 'delete from YourTable from ID =(select ID from(あなたのテーブルorderから時間制限1で選択したID))')を使用することができます。しかし、リエシオの答えはもっと良いようだ。 –

1

のようなサブクエリを使用できます。

delete from table where id in (select id from table order by time limit 1); 

パフォーマンス上の賢明さは、この解決策です。あなたは分析を行い、これがあなたのためにどのように働くかを見なければならないかもしれません。