2012-03-21 12 views
9

To powinno być naprawdę proste Wiem, ale dla mojego życia nie mogę uzyskać mojego zapytania, aby zrobić to, czego potrzebuję.Grupa MySQL z klauzulą ​​where z liczbą większą niż 1

Szukam znaleźć wszystkie wiersze, które mają określony status (paid) pogrupowane przez ref, ale tylko wtedy, gdy znaleziono więcej niż 1 wiersz.

To jest mój stół próbki:

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

To jest mój SQL:

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

muszę mieć ono dopasowane przez SUBSTR powodu ref czasami zawierające dołączone numery.

Problemem jest to, że moje zapytanie wraca to:

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

Kiedy Chciałbym to być powrót ref s 10001, 10003 & 10006.

Czy ktoś może mi pomóc dowiedzieć się, co robię źle?

Dzięki

Odpowiedz

13

Try

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

Stanowisko-argument za SUBSTR zaczyna się od 1, a nie 0.

8

Od SUBSTR Doc:

Dla wszystkich form podciąg(), pozycja pierwszego znaku w łańcuchu, z którego ma zostać pobrany podciąg, jest obliczana jako 1.

Więc spróbuj tego:

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

A ja pokonać przez 8 sekund .. :) – barsju

+0

Thanx! Doceń ... Zawarłem cytat z dokumentu. To właśnie mnie kosztowało 8 sekund .. :) – barsju

Powiązane problemy