2012-03-21 27 views
9

Điều này phải thực sự đơn giản mà tôi biết, nhưng đối với cuộc sống của tôi, tôi không thể truy vấn để làm những gì tôi cần.Nhóm MySQL theo mệnh đề where với số lượng lớn hơn 1

Tôi đang tìm tất cả các hàng có trạng thái nhất định (paid) được nhóm theo ref nhưng chỉ khi có nhiều hơn 1 hàng được tìm thấy.

Đây là bảng mẫu của tôi:

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

Đây là SQL của tôi:

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

tôi cần phải có nó phù hợp bởi SUBSTR do ref đôi khi chứa các số nối.

Vấn đề là truy vấn của tôi đang trở lại này:

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

Khi tôi muốn nó được trở về ref s 10001, 10003 & 10006.

Có ai có thể giúp tôi giải quyết những gì tôi đang làm không?

Cảm ơn

Trả lời

13

Hãy thử

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

Vị trí đối số cho SUBSTR bắt đầu với 1, không phải với 0.

8

Từ SUBSTR doc:

Đối với tất cả các hình thức substring(), vị trí của ký tự đầu tiên trong chuỗi mà chuỗi con được trích xuất được tính là 1.

Vì vậy, cố gắng này:

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

Và tôi đã đánh bại 8 giây .. :) – barsju

+0

Thanx! Đánh giá cao .. Tôi đã bao gồm các báo từ doc .. Đó là những gì chi phí cho tôi trong 8 giây .. :) – barsju

Các vấn đề liên quan