2011-12-19 38 views
12

Tôi muốn trả về một hàng cho mỗi cụm dữ liệu có một số amount, operation, monthsfee cho một id nhất định.Id danh sách trong truy vấn nhóm

Bảng như sau:

enter image description here

Tôi gần như có thể nhận được những gì tôi muốn với

SELECT amount, operation, months, fee, plan_id 
FROM promo_discounts 
WHERE promo_id = 1 
GROUP BY amount, operation, months, fee 

nào sẽ nhận được:

enter image description here

Nhưng thấy nó chỉ trả về một plan_id khi tôi muốn trả lại nội dung nào đó như 1, 2, 3

Điều này có khả thi không?

Trả lời

25

Bạn có thể sử dụng GROUP_CONCAT

SELECT amount, operation, months, fee, 
    GROUP_CONCAT(DISTINCT plan_id SEPARATOR ',') AS plan_id 
FROM promo_discounts 
WHERE promo_id = 1 
GROUP BY amount, operation, months, fee 

Cẩn thận mặc dù, rằng độ dài tối đa mặc định là 1024, vì vậy nếu bạn đang làm điều này với một bảng lớn, bạn có thể có giá trị cắt ngắn ..

+0

này đang trở lại 'plan_id' với một giá trị của '[BLOB - 5 B ] –

+0

nvm, có thể làm cho nó hoạt động sau khi xem http://bugs.mysql.com/bug.php?id=19473 –

0

Tôi sẽ không đề xuất GROUP_CONCAT, nếu bạn cần thứ gì đó năng động. GROUP_CONCAT có giới hạn. Những gì bạn có thể làm là sử dụng bảng tạm thời nơi bạn có thể chọn tất cả các hàng ở đó trước tiên, sau đó bạn có thể nhận được kết quả được nhóm của mình. Để lấy các ID, bạn có thể lặp lại các nhóm và chọn từ bảng tạm thời với mệnh đề WHERE có tất cả các nhóm dưới dạng điều kiện. Tôi hiểu nó có thể hơi phức tạp một chút đối với những điều như vậy nhưng tôi nói với tôi rằng đó là một giải pháp tốt nếu bạn thực sự cần phải theo dõi các ID.

1

Điều tôi nảy ra khi giải quyết vấn đề này, là tham gia kết quả group by với cùng một bảng trên các trường của nhóm. Chú ý rằng các tuyên bố WHERE là như nhau trong cả hai lựa chọn

SELECT plan_id 
FROM promo_discounts pd 
JOIN (SELECT amount, operation, months, fee 
    FROM promo_discounts 
    WHERE promo_id = 1 
    GROUP BY amount, operation, months, fee 
) AS grup ON pd.amount = grup.amount 
      AND pd.operation = grup.operation 
      AND pd.months = grup.months 
      AND pd.fee = grup.fee 
WHERE promo_id = 1 

Bây giờ bạn có thể chơi với kết quả để có được chính xác những gì bạn muốn

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