2010-04-10 23 views
9

Tôi có ba bảngLàm thế nào để JOIN một COUNT từ một bảng, và sau đó thực rằng COUNT địa chỉ với một THAM GIA

bài

ID Name 
1 'Something' 
2 'Something else' 
3 'One more' 

Comment

ID PostId ProfileID Comment 
1 1  1   'Hi my name is' 
2 2  2   'I like cakes' 
3 3  3   'I hate cakes' 

Hồ sơ

ID Approved 
1 1   
2 0   
3 1   

Tôi muốn đếm t anh ấy nhận xét về bài đăng có hồ sơ cho nhận xét được phê duyệt

Tôi có thể chọn dữ liệu từ Bài đăng và sau đó tham gia một số từ bình luận. Nhưng số lượng này phải phụ thuộc vào việc Hồ sơ có được chấp thuận hay không.

Kết quả tôi mong đợi là

CommentCount

PostId Count 
1  1 
2  0 
3  1 
+0

là 'cái Profile' bảng 1-1 với' Comment' một? –

+1

Không, một Tiểu sử có thể đưa ra nhiều Nhận xét. –

Trả lời

11

Bạn có thể sử dụng một lồng nhau chọn như thế này:

SELECT Post.Id, temp.Count 
FROM Post 
LEFT JOIN 
(SELECT Post.Id, COUNT(Comment.ID) AS Count 
FROM Post 
LEFT JOIN Comment ON Comment.PostId = Post.ID 
LEFT JOIN Profile ON Profile.ID = Comment.ProfileID 
WHERE Profile.Approved = 1 
GROUP BY Post.Id) 
temp ON temp.Id = Post.ID 

Trong đó sẽ cung cấp cho bạn vô giá trị mà không có bài viết, chứ không phải là không có hồ sơ:

1 1 
2 null 
3 1 

Chỉ cần để cải thiện điều đó, bạn có thể sử dụng nếu để loại bỏ các giá trị rỗng

SELECT Post.Id, if(temp.Count >= 1,temp.Count,0) as newCount 
FROM Post 
LEFT JOIN 
(SELECT Post.Id, COUNT(Comment.ID) AS Count 
FROM Post 
LEFT JOIN Comment ON Comment.PostId = Post.ID 
LEFT JOIN Profile ON Profile.ID = Comment.ProfileID 
WHERE Profile.Approved = 1 
GROUP BY Post.Id) temp ON temp.Id = Post.ID 

Cung cấp cho bạn những gì bạn muốn ban đầu:

1 1 
2 0 
3 1 

Lưu ý: Có lẽ đây là giải pháp thanh lịch nhất!

+0

Công việc tốt. Cảm ơn bạn! –

1
SELECT Post.Id, COUNT(Comment.ID) AS Count 
FROM Post 
LEFT JOIN Comment ON Comment.PostId = Post.ID 
LEFT JOIN Profile ON Profile.ID = Comment.ProfileID 
WHERE Profile.Approved = 1 
GROUP BY Post.Id 

Có lẽ bạn đã không dán nó vì lợi ích của ví dụ này, nhưng bạn có thể đánh giá để hủy chuẩn hóa bảng Profile cùng với số Comment, bằng cách di chuyển cột Approved trong đó.

+0

Đó là một ý tưởng hay! Mặc dù sẽ có nghĩa là một số mã hóa nhiều hơn để đảm bảo rằng các bảng đã được giữ cho đến nay khi một hồ sơ đã được phê duyệt và bị đình chỉ. Ngoài ra, làm thế nào để bạn có được tên bảng xuất hiện dưới dạng mã nội tuyến trong nhận xét của bạn? –

+0

sử dụng phím ~ của bạn, 'Luke' – jonny

+0

Điều đó mang lại cho tôi số lượng chính xác, nhưng chỉ cho' Bài viết' đã có 'Nhận xét'.Tôi cần phải trả lại tất cả 'Bài viết' với số lượng của họ ngay cả khi họ không có bất kỳ bình luận nào. Xin lỗi vì tôi đã không làm rõ điều đó ngay từ đầu. –

4

Từ định nghĩa của COUNT chức năng:

Hàm COUNT sẽ chỉ đếm các hồ sơ, trong đó lĩnh vực trong khung là NOT NULL.

này có nghĩa là bên ngoài đơn giản tham gia như thế này sẽ làm việc:

SELECT Post.ID, COUNT(Comment.ID) 
    FROM Post LEFT JOIN Comment ON (Post.ID = Comment.PostId) 
      LEFT JOIN Profile ON (Profile.ID = Comment.ProfileID AND 
            Profile.Approved = 1) 
GROUP BY Post.ID 
+0

Tính năng này không hoạt động, chỉ trả về hai hàng. Tôi cần tất cả các hàng được trả lại ngay cả khi 'COUNT' là null. –

+0

Xin lỗi, tất nhiên là không - xem cách tôi đã chuyển điều kiện trên Tiểu sử. Đã sửa đổi để sửa chữa ... – topchef

+2

+1 Điều này sẽ là câu trả lời. –

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