MySQL cuenta las ocurrencias superiores a 2

91

Tengo la siguiente estructura de tabla

+  id  +  word  +
+------+--------+

La tabla se llena con las palabras en minúsculas de un texto dado, por lo que el texto

Hola adios hola

resultaría en

+  id  +  word  +
+------+--------+
+   1  + hello  +
+------+--------+
+   2  + bye    +
+------+--------+
+   3  + hello  +
+------+--------+

Quiero hacer una consulta SELECT que devolverá la cantidad de palabras que se repiten al menos dos veces en la tabla (como hola)

SELECT COUNT(id) FROM words WHERE (SELECT COUNT(words.word))>1

lo cual, por supuesto, es tan incorrecto y sobrecargado cuando la mesa es grande. ¿Alguna idea de cómo lograr tal propósito? En el ejemplo dado inherente arriba, esperaría 1

fabjoa
fuente
¿Alguien más ve los guiones bajos como un puente de cuerda "hundido"?
gota

Respuestas:

228

Para obtener una lista de las palabras que aparecen más de una vez junto con la frecuencia con la que ocurren, use una combinación de GROUP BY y HAVING:

SELECT word, COUNT(*) AS cnt
FROM words
GROUP BY word
HAVING cnt > 1

Para encontrar el número de palabras en el conjunto de resultados anterior, utilícelo como una subconsulta y cuente las filas en una consulta externa:

SELECT COUNT(*)
FROM
(
    SELECT NULL
    FROM words
    GROUP BY word
    HAVING COUNT(*) > 1
) T1
Mark Byers
fuente
1
Solo un complemento, puedes usar el alias también en "tener". Como SELECCIONAR palabras, CUENTA (*) COMO cnt DE palabras AGRUPAR POR palabra TENIENDO cnt> 1
Vaibhav Jain
17
SELECT count(word) as count 
FROM words 
GROUP BY word
HAVING count >= 2;
bot403
fuente
CodeIgniter también admite tener, así que esto fue perfecto. Gracias
Won Jun Bae
6

SELECT word, COUNT(*) FROM words GROUP by word HAVING COUNT(*) > 1

a1ex07
fuente