2012-02-29 38 views
6

Tôi đã hỏi một câu hỏi ngày hôm qua về cách kéo ra nhiều kết quả vào một trường và được trả lời GROUP_CONTACT().GROUP_CONCAT rút ra kết quả trống với dấu phân tách

Tôi đã đặt mã này vào mã của tôi và nó hoạt động tốt. Tôi cần phải làm điều này cho hai lĩnh vực và do đó tôi đã bắt đầu sử dụng nó hai lần trong cùng một tuyên bố sql. Thật không may, nó kéo trở lại một danh sách trống cho lĩnh vực thứ hai với dấu phẩy và tôi không quá chắc chắn lý do tại sao.

Đây là dữ liệu sản phẩm mẫu của tôi:

pid || prod 
1 || top 
2 || sweater 

Đây là dữ liệu chứng khoán mẫu của tôi (một số cổ phiếu không có hai kích cỡ ví dụ như eo và ngực):

sid || size1 || size2 || pid 
1 || M  ||  || 1 
2 || L  ||  || 1 
3 || XL ||  || 1 
4 || L  ||  || 2 
5 || XL ||  || 2 

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

SELECT p.id, GROUP_CONCAT(s.size1) size1, GROUP_CONCAT(s.size2) size2, p.prod 
FROM products p JOIN stock s ON s.prodid = p.id 

Đây là những gì cần lưu ý:

pid || size1 || size2 || prod 
1 || M,L,XL ||  || top 
2 || L,XL ||  || sweater 

Đây là những gì nó thực sự được đưa ra:

pid || size1 || size2 || prod 
1 || M,L,XL || ,, || top 
2 || L,XL || ,  || sweater 

Tôi đã kiểm tra để xem nếu có một không gian hoặc bất cứ điều gì trong size2 và không có gì là ở đó.

Tôi đã truy vấn này và các sản phẩm trở lại như tôi mong đợi:

SELECT size1, size2 FROM stock WHERE pid = 1 AND size2 = "" 

Khi tôi truy vấn này, không có gì trở lại:

SELECT size1, size2 FROM stock WHERE pid = 1 AND size2 IS NULL 

Tôi biết GROUP_CONCAT() sẽ bỏ qua kết quả NULL nhưng tôi cần phải làm điều gì đó để ngăn chặn GROUP_CONTACT() hiển thị danh sách phân tách bằng dấu phẩy trống khi chỉ là "" thay vì NULL.

Trả lời

16
SELECT p.id, GROUP_CONCAT(s.size1) size1, 
GROUP_CONCAT(if (s.size2 ='', null, s.size2)) as size2, p.prod 
FROM products p JOIN stock s ON s.prodid = p.id 
2

thử điều này:

SELECT 
    p.id, 
    GROUP_CONCAT(s.size1) size1, 
    GROUP_CONCAT(case when s.size2='' then null else s.size2 end) size2, p.prod 
FROM products p JOIN stock s ON s.prodid = p.id 
0

Bạn đã cố gắng sử dụng GROUP_CONCAT(DISTINCT column)? Từ sự hiểu biết của tôi về tài liệu, nó sẽ dẫn đến một chuỗi rỗng giống như bạn muốn nó.

DISTINCT sẽ loại bỏ tất cả các bản sao khiến bạn chỉ có một lần xuất hiện là "".

7

Bạn cũng có thể sử dụng NULLIF() chức năng để chuyển đổi chuỗi rỗng để NULLs:

SELECT 
    p.id, 
    GROUP_CONCAT(  s.size1 ) AS size1, 
    GROUP_CONCAT(NULLIF(s.size2, '')) AS size2, 
    p.prod 
FROM products AS p 
    INNER JOIN stock AS s ON s.prodid = p.id 
GROUP BY 
    p.id, 
    p.prod 
; 
Các vấn đề liên quan