2016-06-14 11 views
1
CREATE TABLE IF NOT EXISTS `result` (
    `lead_id` int(11) NOT NULL AUTO_INCREMENT, 
    `email` varchar(150) NOT NULL, 
    `active` tinyint(1) NOT NULL DEFAULT '0', 
    PRIMARY KEY (`lead_id`), 
    UNIQUE KEY `lead_id` (`lead_id`), 
    KEY `email` (`email`), 
    KEY `active` (`active`) 
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ; 

INSERT INTO result (email, active) VALUES 
('[email protected]', 1), 
('[email protected]', 0), 
('[email protected]', 0), 
('[email protected]', 1), 
('[email protected]', 1), 
('[email protected]', 1), 
('[email protected]', 0); 


lead_id | email  | active 
--------------------------- 
1  | [email protected] | 1 
2  | [email protected] | 0 
3  | [email protected] | 0 
4  | [email protected] | 1 
5  | [email protected] | 1 
6  | [email protected] | 1 
7  | [email protected] | 0 

Ich brauche die Tabelle zu aktualisieren, so dass nur eine Zeile oder eine Reihe von passenden E-Mail-Adressen aktiv istaktualisiert doppelte Datensätze (erste MTCH nur) in MySQL

Ich kämpfe um eine Abfrage zu schreiben, dies zu tun . Es spielt keine Rolle, welche Zeile. Das Ergebnis würde so aussehen

lead_id | email  | active 
--------------------------- 
1  | [email protected] | 1 
2  | [email protected] | 0 
3  | [email protected] | 0 
4  | [email protected] | 0 
5  | [email protected] | 1 
6  | [email protected] | 0 
7  | [email protected] | 0 

Vielen Dank für Ihre Beratung

+0

Sie Update basierend auf lead_id ...... Update table_name aktiv = 0 gesetzt, wo lead_id in (4,6) –

+0

Ist es möglich, Ihre Daten zu filtern vor dem Senden von SQL tun? Auf diese Weise müssen Sie keine unnötigen Zeilen speichern. UND du würdest dir keine Sorgen machen müssen, eine Abfrage zu erstellen, um die Aufgabe zu erledigen ... stell einfach sicher, dass deine Daten gut ankommen .. :-) – BizzyBob

Antwort

2

Der folgende Ansatz setzt active-0 für jede lead_id/email Gruppe, die nicht den minimalen lead_id Wert hat und ist auch aktiv. Die GROUP BY Unterabfrage würde zwei Datensätze mit Ihren Beispieldaten haben, für lead_id Werte von 1 und 5. Die Tabelle result wird dann damit verbunden, und jeder Datensatz, der nicht mit der Unterabfrage übereinstimmt, hat active Wert auf 0 festgelegt. Das ist in Ordnung, weil entweder der Wert 0 war oder ein Duplikat, das wir entfernen möchten.

UPDATE result AS r1 
LEFT JOIN 
(
    SELECT MIN(lead_id) AS min_lead_id, email, active 
    FROM result 
    WHERE active = 1 
    GROUP BY email, active 
) AS r2 
    ON r1.lead_id = r2.min_lead_id AND r2.email = r2.email 
SET r1.active = 0 
WHERE r2.active IS NULL 
Verwandte Themen