2009-12-14 15 views
7

Ho una tabella con due campi sesskey (varchar32, indice) e prodotti (int11), ora devo cancellare tutte le righe che hanno il gruppo per numero di conteggi (*) = 1. Sto provando alcuni metodi ma tutti falliscono.MYSQL elimina tutti i risultati che hanno il conteggio (*) = 1

Esempio:

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

Il campo sesskey non potrebbe essere una chiave primaria perché il suo ripetuto.

risposta

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 

È necessario unirsi qui. L'utilizzo di una sottoquery correlata non funzionerà.

Vedere questo articolo nel mio blog per maggiori dettagli:

+0

per qualche motivo questo non ha funzionato per me in una recente versione di mysql. Ho dovuto usare l'esempio dal tuo blog (LEFT JOIN, ID IS NULL). Sono riuscito a cancellare anche le righe sbagliate: p (dovevo usare IS NOT NULL per il mio caso) – Spikolynn

1

Il SubQuery dovrebbe funzionare

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

EDIT: Grazie per @Quassnoi commento qui sotto ... È possibile che questo sarà NON lavoro in MySql, come MySql limita riferimento alla tabella essere aggiornato o cancellato da, in una sottoquery i devi fare la stessa cosa usando un join ...

+0

non Lavoreranno (+15 caratteri) – Quassnoi

+0

# 1093 - Non è possibile specificare tabella di destinazione 'Taged' per aggiornamento in clausola – Alex

+0

Questo errore è fonte di confusione ... Non c'è nessun "aggiornamento" in corso qui ... A cosa si riferisce? L'uso del nome di tablatura nella clausola Delet? o l'uso del nometabella nella sottoquery (che non è né Aggiornamento né eliminazione di qualcosa) –

1

Oppure se stai usando un più vecchio (pre 4.1) versione di MySQL e non hanno accesso a sottoquery è necessario selezionare i dati in una tabella, poi unire quel tavolo con l'originale:

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); 

Ora avete una tabella rimasto denominata delete_me_table che contiene una cronologia di tutte le righe eliminate. Puoi usarlo per archiviare, trend, altre cose divertenti e insolite con cui sorprenderti.

Problemi correlati