2010-12-03 19 views
5

Bir tablodaki ilk satırı seçmek, time (artan) ile sıralamak ve sonra o satırı silmek istiyorum. Başka bir müşterinin silinmeden önce bu satırı seçebilme olasılığı olduğu için iki sorgu kullanmak istemiyorum (farklı ağlardan bir kerede birden fazla makine bağlanacaktır).SELECT ve DELETE

ben

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

gibi bir şey yapabileceğini düşünüyordum ... ancak bir hata var:

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

Bunu yapmanın en iyi yolu nedir? Teşekkürler. Hata mesajının yeniden

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

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

cevap

2

Geçici bir tablo oluşturmak zorunda MySQL, bu kodu görmek kullandığınız bir tablodan silmek izin vermez:

DELETE * FROM pending ORDER BY time LIMIT 1 

Sözdiziminizde bir hataya benziyor. *'u kaldırmayı deneyin. Bu, iyi çalışıyor olmalıdır.

+0

TmpTable'ın daha sonra veya daha sonra düşürülmesi gerekiyor mu? –

+1

Evet (15 karakter) –

+0

Geçici olarak bir tablo oluşturmanıza gerek yoktur. Türetilmiş bir tabloyu kullanabilirsiniz '' IDT'den siliniz. = (ID'yi seçin (zaman sınırı 1'den YourTable siparişinizdeki kimliği seçin) t); '. Ancak Riedsio'nun cevabı daha da iyi görünüyor. –

1

Gibi alt sorguları kullanabilirsiniz.

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

Performans konusunda emin değilim, bu çözümün ne kadar iyi olduğuna emin olun. Bir analiz yapmak ve bunun sizin için nasıl çalıştığını görmek zorunda kalabilirsiniz.