mysql masaya çiftleri silmek için nasıl?

6 Cevap php

merhaba ben tabloda belirtilen SID için çoğaltılamaz öğeleri silmek için herhangi bir şekilde bilmek gerekir.

Bu SQL sorguları ile nasıl yapabilirim?

DELETE (DUPLICATED TITLES) FROM table WHERE SID = "1"

Böyle bir şey ama gerçek birini bilmiyorum :/ teşekkürler.

6 Cevap

Bu yeni bir tablo yapmadan, yerinde çiftleri kaldırır

ALTER IGNORE TABLE foobar ADD UNIQUE (title, SID)

Not: dizin belleği sığar eğer sadece iyi çalışır

Tek tek değil sadece, tüm SID-s için çiftleri çıkarın ardından.

Temp tablo ile

CREATE TABLE table_temp AS
SELECT * FROM table GROUP BY title, SID;

DROP TABLE table;
RENAME TABLE table_temp TO table;

Geçici tablo olmadan:

DELETE FROM `table` WHERE id IN (
  SELECT all_duplicates.id FROM (
    SELECT id FROM `table` WHERE (`title`, `SID`) IN (
      SELECT `title`, `SID` FROM `table` GROUP BY `title`, `SID` having count(*) > 1
    )
  ) AS all_duplicates 
  LEFT JOIN (
    SELECT id FROM `table` GROUP BY `title`, `SID` having count(*) > 1
  ) AS grouped_duplicates 
  ON all_duplicates.id = grouped_duplicates.id 
  WHERE grouped_duplicates.id IS NULL
)

U aşağıdaki sütunları olan bir tablo employee olduğunu varsayalım:

employee (first_name, last_name, start_date)

Silmek için yinelenen satırlar şimdi first_name için söylüyor:

delete
from employee using employee,
    employee e1
where employee.id > e1.id
    and employee.first_name = e1.first_name  
DELETE FROM table WHERE Field IN
(SELECT Field FROM table GROUP BY Field HAVING COUNT(Field) > 1)
WHERE SID = "1"

EDIT:

Yukarıdaki sorgu her birini tutmak için, tüm yinelenen kayıtları silmek istiyorsunuz:

DELETE FROM table WHERE id NOT IN

 (SELECT id FROM
     (SELECT id, field 
     FROM table WHERE SID = "1" 
     GROUP BY field 
     HAVING COUNT(field) > 1) 
 as tmp)    

AND field in

 (SELECT DISTINCT field 
 FROM table 
 WHERE SID = "1" 
 GROUP BY field 
 HAVING COUNT(field) > 1)

Ben tam olarak test edemedim ama ben bu işleri düşünüyorum.

Bu işlem son yinelenen tutarak, bir tablodaki tüm çiftleri (dahil katları) kaldıracaktır. Bu Retrieving last record in each group bir uzantısıdır

Bu kimse için yararlı olduğunu umuyoruz.

DROP TABLE IF EXISTS UniqueIDs;
CREATE Temporary table UniqueIDs (id Int(11));

INSERT INTO UniqueIDs
    (SELECT T1.ID FROM Table T1 LEFT JOIN Table T2 ON
    (T1.Field1 = T2.Field1 AND T1.Field2 = T2.Field2 #Comparison Fields 
    AND T1.ID < T2.ID)
    WHERE T2.ID IS NULL);

DELETE FROM Table WHERE id NOT IN (SELECT ID FROM UniqueIDs);