মাইএসকিউএল যেখানে ক্লজ সঙ্গে যোগ দিন


130

আমার দুটি টেবিল রয়েছে যাতে আমি যোগ দিতে চাই।

আমি বিভাগ টেবিলের সমস্ত বিভাগ এবং একইসাথে বিভাগ_ সাবস্ক্রিপশন সারণীর কোনও ব্যবহারকারীর দ্বারা সাবস্ক্রাইব করা সমস্ত বিভাগ চাই।

মূলত এটি এখন পর্যন্ত আমার জিজ্ঞাসা:

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

এটি সূক্ষ্মভাবে কাজ করে তবে আমি কোয়েরির শেষে একটি ধারা যুক্ত করতে চাই যা প্রয়োজনীয়ভাবে এটি অভ্যন্তরীণ / ইকুইতে যোগ দেয়।

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

একটি নির্দিষ্ট ব্যবহারকারীর দ্বারা কেবলমাত্র একটি ক্যোয়ারী ব্যবহার করে সমস্ত বিভাগের পাশাপাশি সমস্ত বিভাগ কীভাবে পেতে পারি?

বিভাগ_আইডি উভয় বিভাগের সারণী এবং ব্যবহারকারী_শ্রেণী_শব্দসমূহের একটি কী হচ্ছে। user_id ব্যবহারকারী_শ্রেণীর_ সাবস্ক্রিপশন সারণীতে থাকা।

ধন্যবাদ


আমি বিশ্বাস করি যে যদি আমি ভুল না করি তবে এটিকে 'রাইট জয়েন' বলা হয়?
টাইলার কার্টার

@ টাইলারকার্টার আপনি অবশ্যই ভুল করেছেন :)
স্কুটার দারাফ

উত্তর:


287

আপনার এটিকে joinক্লজটিতে রাখা দরকার, এটি নয় 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

দেখুন, একটি দিয়ে inner join, একটি ক্লজটি এর মধ্যে joinবা whereতার সমতুল্য করা। তবে, একটি দিয়ে outer joinএগুলি সম্পূর্ণ আলাদা ly

joinশর্ত হিসাবে , আপনি সারণিতে যোগ দিতে হবে এমন সারিটি নির্দিষ্ট করেছেন। এই মানে মূল্যায়ণ যে user_id = 1প্রথম, এবং এর উপসেট লাগে user_category_subscriptionsএকটি সঙ্গে user_idএর 1সকল সারি যোগদান করতে categories। এটি আপনাকে সমস্ত সারি দেবে categories, যখন কেবলমাত্র categoriesএই নির্দিষ্ট ব্যবহারকারী সাবস্ক্রাইব করেছেন কেবলমাত্র user_category_subscriptionsকলামগুলিতে কোনও তথ্য থাকবে । অবশ্যই, সব অন্যান্য categoriesসঙ্গে পূরণ করা হবে nulluser_category_subscriptionsকলাম।

বিপরীতে, একটি whereধারা যোগ দেয় এবং তারপরে রোসেটটি হ্রাস করে। সুতরাং, এটি সমস্তগুলিতে যোগদান করে এবং তারপরে সমস্ত সারি সরিয়ে দেয় যেখানে user_idসমান হয় না 1। আপনি এটি পাওয়ার একটি অদক্ষ উপায় রেখে গেছেন inner join

আশা করি এটি সাহায্য করে!


2
সুন্দরভাবে প্রশ্ন রাখুন, এবং সুন্দরভাবে উত্তর দিন! আমার সময় বাঁচিয়েছে অনেক ধন্যবাদ!
গৌরব ফাপলে

1
আমি তোমাকে অনেক ভালবাসি এরিক আপনি আমাকে কাঁদতে থেকে বাঁচালেন: ডি
রাহেল

অন্যদিকে, আমি যদি ব্যবহারকারীদের জন্য একটি পরিষ্কার ডেটা তৈরি করতে চাই তবে দ্বিতীয় (যেখানে) উপায়টি আরও উপযুক্ত। এটা কি ঠিক ?
vlr

1
হাই আমরা ব্যবহারকারী_ শ্রেণীবদ্ধ_সুবস্ক্রিপশনগুলিকে চুক করতে পারি u ব্যবহারকারীর_আইডি শূন্য। বি টেবিলের শূন্য আইডি থাকা কোনও টেবিলে বিশদ আইডি পুনরুদ্ধার করতে
বীরেশ 123

@ Veeresh123, কি হয় Aএবং Bটেবিল? আপনি কি আপনার প্রশ্নটি নতুন করে বলতে পারেন?
ইসতিয়াক আহমেদ

11

এটা চেষ্টা কর

  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

যদি আমি এখনও এই কোডটি ব্যবহার করে একই ত্রুটি পেয়ে যাচ্ছি তবে আমি পরবর্তী কী খুঁজছি।
জ্যাক ফ্রেঞ্জেন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.