MySQL tham gia với mệnh đề where


130

Tôi có hai bảng tôi muốn tham gia.

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

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

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

Điều 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ó trở thành một phép nối trong / đẳng thức.

   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 để tôi 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ỉ bằng một truy vấn?

category_id là một khóa trong cả hai loại bảng và user_carget_sub mô tả. user_id cư trú trong bảng user_carget_sub mô tả.

cảm ơn


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

@TylerCarter chắc chắn bạn đã nhầm :)
Xe tay ga Daraf

Câu trả lời:


287

Bạn cần đặt nó trong joinmệnh đề, không phải 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 một inner join, đặt một mệnh đề trong joinhoặc wheretương đương. Tuy nhiên, với một outer join, chúng rất khác nhau.

Như một joinđiều kiện, bạn chỉ định các hàng mà bạn sẽ tham gia vào bảng. Điều này có nghĩa rằng nó đánh giá user_id = 1đầu tiên, và có các tập hợp con của user_category_subscriptionsmột user_idsố 1tham 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 categorieskhi chỉ categoriesngười dùng cụ thể này đã đăng ký mới có bất kỳ thông tin nào trong các user_category_subscriptionscột. Tất nhiên, tất cả những thứ khác categoriessẽ được điền nullvào trong các user_category_subscriptionscột.

Ngược lại, một wheremệnh đề thực hiện phép nối, và sau đó giảm 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 user_idkhông bằng nhau 1. Bạn còn lại với một cách không hiệu quả để có được một inner join.

Hy vọng điều này sẽ giúp!


2
Đặt câu hỏi độc đáo, 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!
Gaurav Phapale

1
Tôi yêu bạn rất nhiều Eric bạn đã cứu tôi khỏi khóc: D
Raheel

Mặt khác, nếu tôi muốn tạo một dữ liệu sạch cho người dùng thì cách thứ hai (ở đâu) là phù hợp hơn. Nó có đúng không ?
vlr

1
Xin chào, chúng tôi có thể chuck user_carget_sub mô tả.user_id là null. Để truy xuất chi tiết id trong bảng A có id null trong bảng B
Veeresh123

@ Veeresh123, cái gì ABbảng? Bạn có thể viết lại câu hỏi của bạn?
Istiaque Ahmed

11

Thử cái 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

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 gì tiếp theo.
Jack Franzen
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.