Respuestas:
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 ...
someField
valores no nulos o un conjunto de resultados vacío si no lo hace.
SELECT username, numb from(
Select username, count(username) as numb from customers GROUP BY username ) as my_table
WHERE numb > 3
También puede hacer esto con una autounión:
SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk
Aqui tienes:
SELECT Field1, COUNT(Field1)
FROM Table1
GROUP BY Field1
HAVING COUNT(Field1) > 1
ORDER BY Field1 desc
De una sola mano
SELECT t1.*
FROM db.table t1
WHERE exists
(SELECT *
FROM db.table t2
where t1.pk != t2.pk
and t1.someField = t2.someField)
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.
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
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
También debe mencionarse que el "pk" debe ser un campo clave. La autounión
SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk
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.
GROUP BY
seguro (a menos que esto sea algo de MySQL no estándar)?