2012-03-21 16 views
9

Esto debería ser realmente simple, lo sé, pero por mi vida no puedo hacer que mi consulta haga lo que necesito.Grupo MySQL por con cláusula WHERE con contar más de 1

Estoy buscando para encontrar todas las filas que tienen un cierto estado (paid) agrupadas por ref pero solo si hay más de 1 fila encontrada.

Ésta es mi tabla de ejemplo:

+-----+----------+----------+-------+ 
| id | deleted | status | ref | 
+-----+----------+----------+-------+ 
| 1 |  0 | pending | 10001 | 
| 2 |  0 | paid  | 10001 | 
| 3 |  0 | paid  | 10001 | 
| 4 |  0 | paid  | 10002 | 
| 5 |  1 | pending | 10002 | 
| 6 |  1 | paid  | 10002 | 
| 7 |  0 | pending | 10003 | 
| 8 |  0 | paid  | 10003 | 
| 9 |  0 | paid  | 10003 | 
| 10 |  0 | paid  | 10003 | 
| 11 |  0 | pending | 10004 | 
| 12 |  0 | paid  | 10004 | 
| 13 |  1 | pending | 10005 | 
| 14 |  1 | paid  | 10005 | 
| 15 |  1 | paid  | 10005 | 
| 16 |  0 | paid  | 10005 | 
| 17 |  0 | pending | 10006 | 
| 18 |  0 | paid  | 10006 | 
| 19 |  0 | paid  | 10006 | 
+-----+----------+----------+-------+ 

Ésta es mi SQL:

SELECT * FROM `orders` 
WHERE `deleted` = 0 AND `status` = 'paid' 
GROUP BY SUBSTR(`ref`,0,5) 
HAVING COUNT(*) > 1 
ORDER BY `id` DESC 

necesito tenerlo a juego por SUBSTR debido a ref veces que contiene los números adjuntas.

El problema es que mi consulta se vuelve esto:

+-----+----------+---------+-------+ 
| id | deleted | status | ref | 
+-----+----------+---------+-------+ 
| 2 |  0 | paid | 10001 | 
+-----+----------+---------+-------+ 

Cuando me gustaría que regresará ref s 10001, 10003 & 10006.

¿Alguien me puede ayudar a resolver lo que estoy haciendo mal?

Gracias

Respuesta

13

Prueba

SELECT * FROM `orders` 
WHERE `deleted` = 0 AND `status` = 'paid' 
GROUP BY SUBSTR(`ref`,1,5) 
HAVING COUNT(*) > 1 
ORDER BY `id` DESC 

La posición-argumento para SUBSTR comienza con 1, no con 0.

8

De SUBSTR doc:

Para todas las formas de SUBSECUENCIA(), la posición del primer carácter en la cadena de la que se extraerá la subcadena se calcula como 1.

Así que trate esto:

SELECT * FROM `orders` 
WHERE `deleted` = 0 AND `status` = 'paid' 
GROUP BY SUBSTR(`ref`,1,5) 
HAVING COUNT(*) > 1 
ORDER BY `id` DESC 
+0

Y yo estaba vencido por 8 segundos .. :) – barsju

+0

Gracias! Apreciar ... Incluí la cita del documento ... Eso fue lo que me costó los 8 segundos ... :) – barsju

Cuestiones relacionadas