2011-11-25 17 views
8

que tienen la siguiente consultaMySQL GROUP por Regex?

SELECT Count(*) as Total_Count, Col1 
FROM Table1 
GROUP BY Col1 
ORDER BY Total_Count DESC; 

Quiero hacer un zoom sobre Col1. Los datos de la Col1 están en el siguiente formato:

text-abc1 
txt4-abcde22 
tex6-abc2 
text4-imp4 
text-efg1 
txt-efg43 

Quiero ser capaz de grupo por

After the first `-`, any first three/four/five characters match 

En este ejemplo, si hacemos coincidir con los 3 primeros caracteres. La salida será:

Total_Count Col1 
3    abc 
1    imp 
2    efg 

¿Alguna otra forma de lograrlo?

Respuesta

9

Es posible que no necesite una expresión regular, solo operaciones de cuerda. Para tres caracteres:

SELECT count(*) AS Total_Count, 
SUBSTRING(Col1 FROM POSITION('-' in Col1)+1 FOR 3) AS Col1_zoomed 
FROM Table1 
GROUP BY Col1_zoomed 
ORDER BY Total_Count DESC 
+0

Esta es la correcta. Gracias por eso. Pero 'abcd-1234' necesita ser' Col1'. Por favor cámbialo para que pueda aceptarlo :). – theking963

+0

@ daking963 Como si esta respuesta no lo ayudara cuando una cosa se deletrea de manera diferente? Quisquilloso, quisquilloso! :-p – Wiseguy

+1

@Wiseguy No se trata de ser exigente. Es por la corrección de la respuesta y una futura referencia para los demás. Estoy seguro de que pueden descubrir que, en lugar de la cadena, debería ser el nombre de la columna. Es solo un error tipográfico, Ian puede cambiarlo fácilmente. Para mejorar la calidad general del sitio, en mi opinión, ¡estas pequeñas cosas importan mucho! – theking963

0

Esto debe hacer lo que quiera.

SELECT Count(*) as Total_Count, SUBSTRING(Col1, 1, 3) 
FROM Table1 
GROUP BY SUBSTRING(Col1, 1, 3) 
ORDER BY Total_Count DESC; 
+0

'SUBSTRING (Col1, 1, 3)' no funcionará en este caso ya que necesito unir caracteres después del '-'. Antes del '-' podría haber cualquier cantidad de caracteres. – theking963

+0

Leí mal tu pregunta, pensé que querías la primera 3. La respuesta de Ian es mejor que –

3
select 
substring(substring_index(col1,'-',-1),1,3) as grp, 
count(*) as total 
from table 
group by grp