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?

 87
Author: Mark, 2010-09-14

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...

 130
Author: OMG Ponies,
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
 14
Author: dandy_sql,
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
 13
Author: Bill Karwin,
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)
 4
Author: Martin Smith,
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.

 1
Author: Brent Arias,
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


 1
Author: user4551254,
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

 0
Author: Maham Khan,
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.

 -2
Author: Jim Blanchard,
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