2009-12-14 15 views
7

Tengo una tabla modificada con dos campos sesskey (varchar32, index) y productos (int11), ahora tengo que eliminar todas las filas que tienen group por sesskey count (*) = 1. Estoy intentando algunos métodos pero todos fallan.MYSQL borrar todos los resultados que cuentan count (*) = 1

Ejemplo:

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

El campo sesskey no podría ser una clave primaria porque su repetido.

Respuesta

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 

Debes tener una unión aquí. Usar una subconsulta correlacionada no funcionará.

Ver este artículo en mi blog para más detalles:

+0

por alguna razón esto no funcionó para mí en una versión reciente de MySQL. Tuve que usar el ejemplo de tu blog (LEFT JOIN, ID IS NULL). Logré eliminar las filas incorrectas también: p (tuve que usar IS NOT NULL para mi caso) – Spikolynn

1

la subconsulta debe trabajar

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

EDIT: Gracias a @Quassnoi comentario más abajo ... Lo anterior NO trabajo en MySQL, como MySQL restringe referencia a la tabla Al actualizarse o eliminarse, en una Subconsulta, debe hacer lo mismo con Unirse ...

+0

no funcionará (+15 caracteres) – Quassnoi

+0

# 1093 - No se puede especificar la tabla de destino 'mica' de actualización en FROM cláusula – Alex

+0

Ese error es confuso ... No hay "Actualización" pasando aquí ... ¿A qué se refiere? ¿El uso del nombre de tabla en la cláusula de Delet? o el uso del nombre de tabla en la subconsulta (que no es Actualización ni eliminación de nada) –

1

O si está utilizando una mayores versión de MySQL (pre 4.1) y no tienen acceso a las subconsultas que necesita para seleccionar los datos en una tabla, y luego unirse a la mesa con el original:

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

Ahora usted tiene una mesa de sobra llamado delete_me_table que contiene un historial de todas las filas que eliminaste Puede usar esto para archivar, tendencias, otras cosas divertidas e inusuales para sorprenderse.

Cuestiones relacionadas