Quiero hacer algo como esto:
SELECT *
FROM db.table
WHERE COUNT(someField) > 1
¿Cómo puedo lograr esto en MySql?
Utilice la cláusula HAVING
, not WHERE
, para la comparación de resultados agregados.
Tomando la consulta al pie de la letra:
SELECT *
FROM db.table
HAVING COUNT(someField) > 1
Idealmente, debería haber un GROUP BY
definido para una valoración adecuada en la HAVING
cláusula, pero MySQL permite columnas ocultas del GROUP BY ...
¿Es esto en preparación para una restricción única someField
? Parece que debería ser ...
GROUP BY
seguro (a menos que esto sea algo de MySQL no estándar)?someField
valores no nulos o un conjunto de resultados vacío si no lo hace.fuente
También puede hacer esto con una autounión:
fuente
Aqui tienes:
fuente
De una sola mano
fuente
Como dijo OMG Ponies, la cláusula de tener es lo que buscas. Sin embargo, si esperaba obtener filas discretas en lugar de un resumen (el "tener" crea un resumen), no se puede hacer en una sola declaración. Debe usar dos declaraciones en ese caso.
fuente
Doy un ejemplo en Group By entre dos tablas en Sql:
Select cn.name,ct.name,count(ct.id) totalcity from city ct left join country cn on ct.countryid = cn.id Group By cn.name,ct.name Having totalcity > 2
fuente
Para mí, no tener un grupo simplemente devolvió un resultado vacío. Así que supongo que tener un grupo para la declaración de tener es bastante importante
fuente
También debe mencionarse que el "pk" debe ser un campo clave. La autounión
de Bill Karwin te doy todos los registros que son duplicados que es lo que quería. Debido a que algunos tienen más de dos, puede obtener el mismo registro más de una vez. Escribí todo en otra tabla con los mismos campos para deshacerme de los mismos registros mediante la supresión de campos clave. Lo intenté
SELECT * FROM db.table HAVING COUNT(someField) > 1
arriba primero. Los datos devueltos dan solo uno de los duplicados, menos de la mitad de lo que esto le brinda, pero el recuento es bueno si eso es todo lo que desea.
fuente