2010-09-06 28 views
17

Với truy vấn MySQL sau:Làm cách nào để ngăn GROUP_CONCAT tạo kết quả khi không có dữ liệu đầu vào?

SELECT 
    `show`.`id` 
    , GROUP_CONCAT(`showClips`.`clipId` ORDER BY `position` ASC) AS 'playlist' 
FROM 
    `show` 
    INNER JOIN 
    `showClips` 
     ON 
     (`show`.`id` = `showClips`.`showId`) 
; 

Tôi muốn lấy một danh sách của tất cả các "show" từ cơ sở dữ liệu, bao gồm cả các id của "clip" kiềm chế.

Điều này hoạt động tốt, miễn là có các mục nhập trong bảng show. Đối với vấn đề này, chúng ta hãy giả sử tất cả các bảng là hoàn toàn trống rỗng.

GROUP_CONCAT sẽ trả lại NULL và do đó buộc hàng vào kết quả (chỉ chứa giá trị NULL).

Ứng dụng của tôi sau đó sẽ nghĩ rằng một chương trình/kết quả tồn tại. Nhưng kết quả đó sẽ không hợp lệ. Điều này tất nhiên có thể được kiểm tra, nhưng tôi cảm thấy như thế này có thể (và nên) được ngăn chặn trong các truy vấn đã có.

Trả lời

33

Bạn chỉ nên thêm một GROUP BY ở cuối.

trường hợp thử nghiệm:

CREATE TABLE `show` (id int); 
CREATE TABLE `showClips` (clipId int, showId int, position int); 

SELECT 
    `show`.`id`, 
    GROUP_CONCAT(`showClips`.`clipId` ORDER BY `position` ASC) AS 'playlist' 
FROM `show` 
INNER JOIN `showClips` ON (`show`.`id` = `showClips`.`showId`) 
GROUP BY `show`.`id`; 

Empty set (0.00 sec) 
8

Thêm nhóm theo show. id, kết quả sẽ chính xác cho các bảng trống:

tạo bảng trống (id int, tên varchar (20));

select id, group_concat(name) from emptyt 

kết quả:

NULL, NULL 

truy vấn với nhóm bởi

select id, group_concat(name) from emptyt 
group by Id 

kết quả:

trống dataset

+0

Cảm ơn. Tôi sẽ đánh dấu phản ứng của Daniel là câu trả lời, vì anh ta dường như đã nhanh hơn một giây. –

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