2012-02-01 16 views
5

Bir Madde Kimliği (birincil anahtar) ve bir Makale Başlığı içeren bir MySQL veritabanı tablom var. Yinelenen başlıkları tablodan kaldırmak istiyorum, ancak başlığın ilk oluşumunu koru.Bir MySQL UPDATE ifadesinde OFFSET'i nasıl taklit edebilirim?

UPDATE articles 
SET title = '' 
WHERE title = '$duplicate_title' 

Ben güncellemek istiyorum:

SELECT 
    title, 
    count(id) AS count 
FROM articles 
GROUP BY title 
HAVING count > 1 

Sonra bir foreach döngüsü ve bu komutu kullanarak bir boş ile tüm yinelenen başlıklar değiştirdik: Başlangıçta sadece tüm yinelenen başlıklar için bir sorgu yaptılar articles tablosunu ve ilk giriş hariç tüm yinelenen başlıkları değiştirerek, bu gibi bir şey kullanarak Makale Kimliği ASC'ye dayalı olarak. Sorun şu ki, OFFSET bir UPDATE'de çalışmıyor gibi görünüyor. Bunu tek bir sorguda yapmanın bir yolu var mı?

UPDATE articles 
SET title = '' 
WHERE title = '$duplicate_title' 
ORDER BY id ASC 
OFFSET 1 

cevap

1
UPDATE articles a 
INNER JOIN articles b 
    ON a.title = b.title AND a.ID > b.ID 
SET title = ''; 

Bu temelde

güncelleme ben biraz başka çözüm buldu

+0

ne a ve açıklayabilir misiniz? sözdizimi yapar? Diğer sorgularda bir çeşit "hile" gördüm ve neler olduğunu anladıktan sonra bile anlayamadım. –

+1

'' ', uygun bir şekilde gelişmiş bir istemci (PHP'nin PDO uzantısı gibi) verilen [hazırlanan ifadeler] (http://en.wikipedia.org/wiki/Prepared_statement) 'da genel olarak kullanılan bir parametre yer tutucudur – Phil

+0

Tamam, açıkım ? ve PDO. Şimdi '' GÜNCELLEŞTİRME makaleleri '' ve '1'DEN makalelerden SELECT' ne yapıyor? Özellikle, "a" ve "sub" demek istiyorum. Bu, 'bir' gibi makaleler, iç sorgudaki dış sorgudaki verileri bir çakışma olmadan erişmemize izin veren bir kısayol mu? –

1

aynı başlıkla eşleşen bir makale ve bir alt kimlik vardır tüm makaleleri diyor orijinal sorumun kapsamı dışında, ancak yine de alakalı.

Zaten onları bulduğu ilk sorgudan çoğaltma sayısı vardı. Bu sayımdan bir tane çıkardım, daha sonra UPDATE sorgumu ID DESC ile sipariş ettim ve daha sonra sorguyu eksi 1'e sınırlandırdım. Bu aynı amaca hizmet eder ve ilk giriş hariç tüm kopyaları kaldırır. İşte

GÜNCELLEME sorgu kullandığım edilir:

UPDATE articles 
SET title = '' 
WHERE title = '$duplicate_title' 
ORDER BY id DESC 
LIMIT $duplicate_count_minus_one 
İlgili konular