2009-08-02 43 views
103

Tôi có hai bảng tôi muốn tham gia.MySQL tham gia với mệnh đề where

Tôi muốn tất cả các danh mục trong bảng danh mục và cũng có tất cả các danh mục được người dùng đăng ký trong bảng category_subscriptions.

về cơ bản đây là câu hỏi của tôi cho đến nay:

SELECT * 
FROM categories 
LEFT JOIN user_category_subscriptions 
    ON user_category_subscriptions.category_id = categories.category_id 

này hoạt động tốt tuy nhiên tôi muốn thêm một mệnh đề where vào cuối truy vấn mà sau đó về cơ bản làm cho nó một nội/equi tham gia.

SELECT * 
    FROM categories 
    LEFT JOIN user_category_subscriptions 
     ON user_category_subscriptions.category_id = categories.category_id 
    WHERE user_category_subscriptions.user_id = 1 

Làm cách nào để có được tất cả các danh mục cũng như tất cả các danh mục được đăng ký bởi một người dùng cụ thể chỉ sử dụng một truy vấn?

category_id là khóa trong cả bảng danh mục và user_category_subscriptions. user_id nằm trong bảng user_category_subscriptions.

nhờ

+0

Tôi tin rằng nó được gọi là một 'Ngay Tham gia' nhầm lẫn nếu như tôi không? –

+0

@TylerCarter bạn chắc chắn nhầm lẫn :) –

Trả lời

221

Bạn cần phải đặt nó trong mệnh đề join, không phải là where:

SELECT * 
FROM categories 
LEFT JOIN user_category_subscriptions ON 
    user_category_subscriptions.category_id = categories.category_id 
    and user_category_subscriptions.user_id =1 

Xem, với inner join, đưa một điều khoản trong join hoặc where là tương đương. Tuy nhiên, với outer join, chúng rất khác nhau.

Là một điều kiện join, bạn chỉ định rowset mà bạn sẽ tham gia vào bảng. Điều này có nghĩa là trước tiên nó đánh giá user_id = 1 và lấy tập con của user_category_subscriptions với một số user_id của 1 để tham gia vào tất cả các hàng trong categories. Điều này sẽ cung cấp cho bạn tất cả các hàng trong số categories, trong khi chỉ categories mà người dùng cụ thể này đã đăng ký sẽ có bất kỳ thông tin nào trong các cột user_category_subscriptions. Tất nhiên, tất cả các khác categories sẽ được điền với null trong các cột user_category_subscriptions.

Ngược lại, mệnh đề where thực hiện phép nối và sau đó sẽ giảm bớt các hàng. Vì vậy, điều này thực hiện tất cả các phép nối và sau đó loại bỏ tất cả các hàng nơi user_id không bằng 1. Bạn còn lại với một cách không hiệu quả để có được một số inner join.

Hy vọng điều này sẽ hữu ích!

+1

+1 cho câu trả lời được giải thích tuyệt vời. – simnom

+1

+1 để có câu trả lời tuyệt vời! –

+2

Đặt câu hỏi và đặt câu trả lời độc đáo! đã tiết kiệm thời gian của tôi. cảm ơn rất nhiều! –

10

Hãy thử điều này

SELECT * 
    FROM categories 
    LEFT JOIN user_category_subscriptions 
     ON user_category_subscriptions.category_id = categories.category_id 
    WHERE user_category_subscriptions.user_id = 1 
      or user_category_subscriptions.user_id is null 
+0

Nếu tôi vẫn gặp lỗi tương tự khi sử dụng mã này, tôi sẽ tìm kiếm điều gì tiếp theo. –

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