MySQL bergabung dengan klausa mana

130

Saya punya dua tabel yang ingin saya gabung.

Saya ingin semua kategori di tabel kategori dan juga semua kategori berlangganan oleh pengguna di tabel category_subscription.

pada dasarnya ini adalah permintaan saya sejauh ini:

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

Ini berfungsi dengan baik namun saya ingin menambahkan klausa di mana pada akhir kueri yang kemudian pada dasarnya membuatnya menjadi bagian / equi bergabung.

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

Bagaimana cara saya mendapatkan semua kategori serta semua kategori berlangganan oleh pengguna tertentu hanya menggunakan satu permintaan?

category_id menjadi kunci dalam tabel kategori dan user_category_subscription. user_id berada di tabel user_category_subscription.

Terima kasih

mmundiff
sumber
Saya percaya bahwa ini disebut 'Right Join' jika saya tidak salah?
Tyler Carter
@TylerCarter Anda pasti salah :)
Scooter Daraf

Jawaban:

287

Anda harus memasukkannya ke dalam joinklausa, bukan pada 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

Lihat, dengan inner join, meletakkan klausa di dalam joinatau yang wheresetara. Namun, dengan outer join, mereka sangat berbeda.

Sebagai joinsyarat, Anda menentukan rowset yang akan Anda gabungkan ke tabel. Ini berarti bahwa mengevaluasi user_id = 1pertama, dan mengambil bagian dari user_category_subscriptionsdengan user_iddari 1untuk bergabung ke semua baris dalam categories. Ini akan memberi Anda semua baris di categories, sementara hanya categoriesyang berlangganan pengguna ini akan memiliki informasi di user_category_subscriptionskolom. Tentu saja, semua yang lain categoriesakan diisi dengan nulldi user_category_subscriptionskolom.

Sebaliknya, whereklausa melakukan penggabungan, dan kemudian mengurangi rowset. Jadi, ini melakukan semua gabungan dan kemudian menghilangkan semua baris di mana user_idtidak sama 1. Anda dibiarkan dengan cara yang tidak efisien untuk mendapatkan inner join.

Semoga ini bisa membantu!

Eric
sumber
2
Ajukan pertanyaan dengan baik, dan berikan jawaban dengan baik! menghemat waktu saya. Terima kasih banyak!
Gaurav Phapale
1
Aku sangat mencintaimu Eric, kamu membuatku tidak menangis: D
Raheel
Di sisi lain, jika saya ingin menghasilkan data yang bersih untuk pengguna, cara kedua (mana) lebih tepat. Apakah itu benar ?
vlr
1
Hai, bisakah kita buang user_category_subscription.user_id adalah null. Untuk mengambil id detail dalam tabel A yang memiliki id null dalam tabel B
Veeresh123
@ Veeresh123, apa Adan Btabel apa? Bisakah Anda ulangi pertanyaan Anda?
Istiaque Ahmed
11

Coba ini

  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
Jaffarali
sumber
Jika saya masih mendapatkan kesalahan yang sama dengan menggunakan kode ini, apa yang harus saya cari selanjutnya.
Jack Franzen