2012-03-21 8 views
9

Questo dovrebbe essere molto semplice, lo so, ma per la vita di me non riesco a ottenere la mia query per fare ciò che mi serve.Gruppo MySQL con clausola where con avere un numero maggiore di 1

Sto cercando di trovare tutte le righe che sono un determinato stato (paid) raggruppate per ref ma solo se è stata trovata più di 1 riga.

Questa è la mia tabella di esempio:

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

Questo è il mio SQL:

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

ho bisogno di farlo corrispondenza da SUBSTR causa ref volte che contiene i numeri che seguono.

Il problema è che la mia domanda sta tornando in questo modo:

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

Quando mi piacerebbe che ritornerà ref s 10001, 10003 & 10006.

Qualcuno può aiutarmi a capire cosa sto facendo male?

Grazie

risposta

13

Prova

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

La posizione-argomento per SUBSTR inizia con 1, non con 0.

8

Da SUBSTR doc:

Per tutte le forme di SUBSTRING(), la posizione del primo carattere nella stringa da cui deve essere estratta la sottostringa è stimata come 1.

Quindi provare questo:

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

E sono stato battuto da 8 secondi .. :) – barsju

+0

Grazie! Apprezzo .. Ho incluso la citazione dal doc .. Questo è quello che mi costa 8 secondi .. :) – barsju

Problemi correlati