Seleccione donde el recuento de un campo es mayor que uno
Quiero hacer algo como esto:
SELECT *
FROM db.table
WHERE COUNT(someField) > 1
¿Cómo puedo lograr esto en MySQL?
8 answers
Use la cláusula HAVING
, no WHERE
, para la comparación de resultados agregados.
Tomando la consulta en su valor nominal:
SELECT *
FROM db.table
HAVING COUNT(someField) > 1
Idealmente, debería haber un GROUP BY
definido para una valoración adecuada en la cláusula HAVING
, pero MySQL permite columnas ocultas del GRUPO POR...
¿Es esto en preparación para una restricción única en someField
? Parece que debería serlo...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-14 15:45:17
SELECT username, numb from(
Select username, count(username) as numb from customers GROUP BY username ) as my_table
WHERE numb > 3
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-06-29 04:56:12
También puedes hacer esto con un auto-join:
SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-14 15:57:20
Unidireccional
SELECT t1.*
FROM db.table t1
WHERE exists
(SELECT *
FROM db.table t2
where t1.pk != t2.pk
and t1.someField = t2.someField)
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-14 15:45:34
Como OMG Ponies declaró, 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 instrucción. Debe usar dos declaraciones en ese caso.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-09-14 15:47:23
Doy un ejemplo arriba en Grupo Por entre dos tabla 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
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-10 16:07:50
Para mí, no tener un grupo por solo devuelve un resultado vacío. Así que supongo que tener un grupo por para la declaración de tener es bastante importante
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-29 13:10:17
También debe mencionarse que el "pk" debe ser un campo clave. El auto-join
SELECT t1.* FROM db.table t1
JOIN db.table t2 ON t1.someField = t2.someField AND t1.pk != t2.pk
Por Bill Karwin darle todos los registros que son duplicados que es lo que quería. Porque algunos tienen más de dos, puede obtener el mismo registro más de una vez. Escribí todo a otra tabla con los mismos campos para deshacerse de los mismos registros mediante la supresión de campos clave. He intentado
SELECT * FROM db.table HAVING COUNT(someField) > 1
Arriba primero. Los datos devueltos de él dan solamente uno de los duplicados, menos que 1/2 de lo que esto te da pero la cuenta es buena si eso es todo lo que quieres.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-03-02 22:19:46