MySQL, where cümlesiyle birleşir


131

Katılmak istediğim iki masam var.

Kategoriler tablosundaki tüm kategorileri ve ayrıca category_subscriptions tablosundaki bir kullanıcı tarafından abone olunan tüm kategorileri istiyorum.

esasen şu ana kadarki sorgum şu:

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

Bu iyi çalışıyor, ancak sorgunun sonuna bir where cümlesi eklemek istiyorum, bu da onu esasen bir iç / eşit birleştirme yapar.

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

Tek bir sorgu kullanarak belirli bir kullanıcının abone olduğu tüm kategorileri ve tüm kategorileri nasıl edinebilirim?

category_id, hem kategori tablosunda hem de user_category_subscriptions için bir anahtardır. user_category_subscriptions tablosunda bulunan user_id.

Teşekkürler


Yanılmıyorsam buna 'Doğru Birleştirme' denildiğine inanıyorum.
Tyler Carter

@TylerCarter kesinlikle yanılıyorsunuz :)
Scooter Daraf

Yanıtlar:


287

Maddeye koymanız gerekir, şu joinmaddeye değil 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

Bakın, ile bir inner joincümle koymak joinveya whereeşdeğerdir. Bununla birlikte, bir ile outer joinçok farklıdırlar.

Bir itibariyle joindurum, size masaya katılmadan olacak satır kümesi belirtin. Bu araçlar da değerlendirir olduğunu user_id = 1ilk ve alt kümesini alır user_category_subscriptionsbir ile user_idait 1tüm satırları katılmak için categories. Bu size içindeki tüm satırları categoriesverirken, yalnızca categoriesbu kullanıcının abone olduğu user_category_subscriptionssütunlarda herhangi bir bilgi olacaktır . Tabii ki, tüm diğer categoriesdoldurulur nulliçindeuser_category_subscriptions sütunlar.

Tersine, bir whereyan tümce birleştirmeyi yapar ve ardından satır kümesini azaltır. Yani, bu tüm birleştirmeleri yapar ve sonra user_ideşit olmayan tüm satırları ortadan kaldırır 1. Verimsiz bir yolla kaldınızinner join .

Umarım bu yardımcı olur!


2
Güzelce soru ve güzelce cevap ver! zamanımı kurtardım. çok teşekkürler!
Gaurav Phapale

1
Seni çok seviyorum Eric beni ağlamaktan kurtardın: D
Raheel

Öte yandan kullanıcılar için temiz bir veri üretmek istersem ikinci (nerede) yol daha uygundur. Doğru mu ?
vlr

1
Merhaba user_category_subscriptions.user_id null olabilir. B tablosunda boş kimliği olan A tablosundaki ayrıntı kimliğini almak için
Veeresh123

@ Veeresh123, nedir Ave Btablo? Sorunuzu yeniden ifade edebilir misiniz?
Istiaque Ahmed

11

Bunu dene

  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

Bu kodu kullanırken hala aynı hatayı alıyorsam, sonra ne ararım?
Jack Franzen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.