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


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সঙ্গে পূরণ করা হবে nullএ user_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.