2010-01-02 37 views
42

Tôi đang cố gắng tạo một trang tin tức cho một trang web mà tôi đang làm việc. Tôi quyết định rằng tôi muốn sử dụng các truy vấn MySQL chính xác (có nghĩa là COUNT (id) và join thay vì nhiều hơn một truy vấn hoặc num_rows.) Tôi đang sử dụng một trình bao bọc PDO, nó sẽ hoạt động tốt và điều này vẫn không thành công khi chạy trực tiếp thông qua Ứng dụng MySQL CLI.MySQL Nhiều lần tham gia trái

Về cơ bản, tôi có 3 bảng. Một người nắm giữ tin tức, một người giữ các ý kiến ​​và một người giữ người dùng. Mục đích của tôi ở đây là tạo một trang hiển thị tất cả (sẽ phân trang sau) các tiêu đề bài viết, nội dung, tác giả và ngày tháng. Điều này làm việc tốt khi tôi sử dụng một truy vấn thứ hai để có được tên người dùng, nhưng sau đó tôi quyết định tôi muốn sử dụng JOIN.

Vậy vấn đề là gì? Vâng, tôi cần hai tham gia. Một là để có được tên người dùng của tác giả và người kia để có được số lượng bình luận. Khi tôi chỉ đơn giản là đi cho tên người dùng của tác giả, tất cả các công trình như mong đợi. Tất cả các hàng (có 2) trong bảng tin được hiển thị. Tuy nhiên, khi tôi thêm LEFT JOIN thứ hai cho hàng nhận xét, tôi sẽ chỉ nhận được một hàng từ tin tức (nhớ, có 2,) và COUNT (comments.id) cho tôi 2 (nó sẽ hiển thị 1, như tôi có một bình luận cho mỗi bài viết.)

Tôi đang làm gì sai? Tại sao nó chỉ hiển thị một bài viết tin tức, và nói rằng nó có hai ý kiến, khi có hai bài viết tin tức, mỗi bài có một bình luận?

SELECT news.id, users.username, news.title, news.date, news.body, COUNT(comments.id) 
FROM news 
LEFT JOIN users 
ON news.user_id = users.id 
LEFT JOIN comments 
ON comments.news_id = news.id 

Ngoài ra, chỉ để chắc chắn về một điều khác, tôi tham gia nhận xét là cách chính xác để nhận tất cả các bài đăng bất kể họ có nhận xét hay không, đúng không? Hay đó có phải là một sự tham gia đúng không? Oh, một điều cuối cùng ... nếu tôi chuyển comments.news_id = news.id thành news.id = comments.news_id, tôi nhận được 0 kết quả.

Trả lời

80

Bạn đang thiếu một mệnh đề GROUP BY:

SELECT news.id, users.username, news.title, news.date, news.body, COUNT(comments.id) 
FROM news 
LEFT JOIN users 
ON news.user_id = users.id 
LEFT JOIN comments 
ON comments.news_id = news.id 
GROUP BY news.id 

Các trái tham gia là đúng. Nếu bạn đã sử dụng INNER hoặc RIGHT JOIN thì bạn sẽ không nhận được các mục tin tức không có nhận xét.

+0

Bạn có phải sử dụng Nhóm theo không? Việc gia nhập hai tân binh của tôi không hoạt động, và tôi đang cố gắng tìm hiểu lý do. –

+0

Cảm ơn - nó đã giúp tôi giải quyết một vấn đề khó đủ để tôi dành 3 giờ - giải quyết chỉ trong vài phút – Muhammad

+0

Cảm ơn anh lớn. Giải quyết vấn đề của tôi tốt :). – C4u

7

Để hiển thị tất cả chi tiết cho mỗi tiêu đề bài viết tin tức tức là. "news.id" là khóa chính, bạn cần sử dụng mệnh đề GROUP BY cho "news.id"

SELECT news.id, users.username, news.title, news.date, 
     news.body, COUNT(comments.id) 
FROM news 
LEFT JOIN users 
ON news.user_id = users.id 
LEFT JOIN comments 
ON comments.news_id = news.id 
GROUP BY news.id 
Các vấn đề liên quan