2009-12-14 30 views
7

İki alanlı oturum tuşu (varchar32, index) ve ürünler (int11) ile bir tablo hazırladım, şimdi gruba sahip olan tüm satırları silmek zorundayım (*) = 1. Birkaç yöntem deniyorum ama hepsi başarısız.MYSQL sayım sonucu silindi (*) = 1

Örnek: olarak tekrar için

delete from taged where sesskey in (select sesskey from taged group by sesskey having count(*) = 1) 

sesskey alan birincil anahtar olabilir. MySQL tabloya başvuran kısıtladığı için ... aşağıda yorumunu @Quassnoi için MySql yukarıda olacak DEĞİL işi Teşekkür:

cevap

9
DELETE si 
FROM t_session si 
JOIN (
     SELECT sesskey 
     FROM t_session so 
     GROUP BY 
       sesskey 
     HAVING COUNT(*) = 1 
     ) q 
ON  q.sesskey = si.sesskey 

Buraya bir katılımınız olması gerekir. İlişkili bir alt sorgu kullanılması işe yaramaz.

daha fazla ayrıntı için bloguma bu makaleye bakın:

+0

nedense bu benim için son zamanlarda bir mysql sürümünde çalışmadı. Örneği blogunuzda kullanmak zorundaydım (SOL JOIN, ID IS NULL). Yanlış satırları da silmeyi başardım: p (benim durumum için IS NOT NULL kullanmak zorunda kaldı) – Spikolynn

1

alt sorgu

Delete from taged 
    Where sesskey in 
    (Select sesskey 
     From taged 
     Group by sesskey 
     Having count(*) = 1) 

DÜZENLEME çalışması gerekir Bir Subquery'de güncellenmiş veya silinmiş olmakla, bir öğeyi kullanarak aynı şeyi yapmalısınız ...

+0

# 1093 – Quassnoi

+0

(+15 karakter) Çalışmaz - Hedef tablo belirleyemezsiniz için 'taged' FROM yan tümcesinde güncelleştirme – Alex

+0

Bu hata kafa karıştırıcı ... Burada "Güncelleme" diye bir şey yok ... Bunun anlamı nedir? Delet deyimindeki tablename kullanımı? veya alt sorgunun alt sorgusundaki kullanımı (ne Güncelleniyor ne de siliyor) –

1

yaşlı (4.1 öncesi) MySQL sürümü ve bir tabloya veri seçmenize gerek alt sorgular erişimi yok, o zaman orijinal ile bu tabloyu katılmak: Artık

CREATE TABLE delete_me_table (sesskey varchar32, cur_total int); 

INSERT INTO delete_me_table SELECT sesskey, count(*) as cur_total FROM orig_table 
WHERE cur_total = 1 GROUP BY sesskey; 

DELETE FROM orig_table INNER JOIN delete_me_table USING (sesskey); 

Eğer delete_me_table adında üzerinde bir tablo kalmadı Bu, sildiğiniz tüm satırların geçmişini içerir. Bunu, kendinizi şaşırtmak için arşivleme, trend yapma, diğer eğlenceli ve sıra dışı şeyler için kullanabilirsiniz.