2016-03-29 14 views
0

Ich habe eine Tabelle mit userID, sectionId, usersectionID, valid Spalten. Diese gültige Spalte wird verwendet, um die doppelten Einträge zu identifizieren. Einige der doppelten Einträge sind jedoch in der gültigen Spalte enthalten.Suchen doppelte Einträge und Aktualisieren einer Spalte - Mysql

select userID, sectionId, count(*) as cnt from table where valid = 1 group by 1,2 having cnt >1 ; 

Dies würde mir die Liste der Benutzer-ID und sectionID Kombinationen doppelte Einträge zeigen. Wenn eine Kombination aus Benutzer-ID und Abschnitts-ID mehr als einen Eintrag enthält, bedeutet dies, dass ein doppelter Eintrag vorhanden ist. Jetzt

Zum Beispiel dies die Ausgabe sein kann,

userId  SectionID  Cnt 
1    4    3 

wenn wir dies weiter zu sehen,

Select userId, sectionId, usersectionID, valid from table where userID = 1 and sectionID = 4; 

userID  sectionID usersectionID valid 
1    4   3    1 
1    4   5    1 
1    4   10   1 

Ich mag die gültige Spalte mit 0 für alle Einträge mit Ausnahme mindestens usersectionID aktualisieren . Die Ausgabe nach dieser Abfrage sollte

userID  sectionID usersectionID valid 
1    4   3    1 
1    4   5    0 
1    4   10   0 

Ich möchte dies für die vollständige Tabelle in einer einzigen Abfrage tun. Ich habe das schon lange mit viel Erfolg versucht. Kann mir jemand bei der Lösung helfen? oder vielleicht sogar eine Idee geben, dies zu tun?

Dank

Antwort

1

Verwenden Sie ein Update mit einem Selbst JOIN die Duplikate zu finden, die als ungültig markiert werden sollte.

UPDATE table AS t1 
JOIN (SELECT userID, sectionID, MIN(usersectionID) AS minusersectionID 
     FROM table 
     WHERE valid = 1 
     GROUP BY userID, sectionID) AS t2 
ON t1.userID = t2.userID AND t1.sectionID = t2.sectionID AND t1.usersectionID != t2.minusersectionID 
SET t1.valid = 0 
WHERE t1.VALID = 1 
+0

Wow .. Das ist sehr gut Abfrage .. Vielen Dank! – Observer

1

Sie können einen der folgenden Ansätze verwenden.

aktualisieren basierend auf Mindest

Update TableName 
JOIN (
    SELECT userID, sectionID, MIN(userSectionID) AS minuserSectionID 
    FROM TableName 
    GROUP BY userID, sectionID 
) AS T 
Set Valid = 1 
WHERE 
TableName.userID = T.userID 
AND TableName.sectionID = T.sectionID 
AND TableName.userSectionID = T.minuserSectionID; 

ODER NUTZEN aktualisieren basierend auf Rang 1. Wert

SET @rank=0; 
Update TableName 
JOIN (
    SELECT userID, sectionID, @rank:[email protected]+1 AS rownumber 
    FROM TableName 
    GROUP BY userID, sectionID 
) AS T 
Set Valid = 1 
WHERE 
TableName.userID = T.userID 
AND TableName.sectionID = T.sectionID 
AND T.rownumber = 1; 
Verwandte Themen