ক্লজ যেখানে বামে যোগদান করুন


162

আমাকে সেটিংস টেবিল থেকে সমস্ত ডিফল্ট সেটিংস পুনরুদ্ধার করতে হবে তবে এক্স অক্ষরের জন্য উপস্থিত থাকলে অক্ষর সেটিংসটিও দখল করতে হবে।

তবে এই ক্যোয়ারীটি কেবল সেটিংগুলি পুনরুদ্ধার করছে যেখানে অক্ষরটি = 1, ব্যবহারকারীর কাউকে সেট না করে থাকলে ডিফল্ট সেটিংস নয়।

SELECT `settings`.*, `character_settings`.`value`
FROM (`settings`)
LEFT JOIN `character_settings` 
ON `character_settings`.`setting_id` = `settings`.`id`
WHERE `character_settings`.`character_id` = '1'  

সুতরাং আমার এর মতো কিছু হওয়া উচিত:

array(
    '0' => array('somekey' => 'keyname', 'value' => 'thevalue'),
    '1' => array('somekey2' => 'keyname2'),
    '2' => array('somekey3' => 'keyname3')
)

কী 1 এবং 2 টি ডিফল্ট মান হয় যেখানে কী 0 টিতে অক্ষরের মান সহ ডিফল্ট মান থাকে।

উত্তর:


345

whereদফা দূরে সারি যেখানে ফিল্টারিং করা হয় left joinনা সফল না। এটি যোগ দিতে সরান:

SELECT  `settings`.*, `character_settings`.`value`
FROM    `settings`
LEFT JOIN 
       `character_settings` 
ON     `character_settings`.`setting_id` = `settings`.`id`
        AND `character_settings`.`character_id` = '1'  

55

আউট জয়েন (এএনএসআই -৯৯ বা এএনএসআই -৯৯) তৈরি করার সময় পরিস্রাবণ অবস্থানের বিষয়টি গুরুত্বপূর্ণ কারণ শর্তে সুনির্দিষ্ট মাপদণ্ড JOIN হওয়ার আগেON প্রয়োগ করা হয় । ক্লজটিতে সরবরাহ করা একটি আউটর জোইনড টেবিলের বিরুদ্ধে মানদণ্ডটি জোইন তৈরির পরেWHERE প্রয়োগ করা হয় । এটি খুব আলাদা ফলাফলের সেট তৈরি করতে পারে। তুলনায়, এটা কোন ব্যাপার না INNER যোগদান করে যদি বিচার্য বিষয় প্রদান করা হয় ONবা WHEREক্লজ - ফল একই হবে।

  SELECT  s.*, 
          cs.`value`
     FROM SETTINGS s
LEFT JOIN CHARACTER_SETTINGS cs ON cs.setting_id = s.id
                               AND cs.character_id = 1

21

আমি যদি আপনার প্রশ্নটি সঠিকভাবে বুঝতে পারি তবে আপনি সেটিংস ডাটাবেস থেকে রেকর্ড চান যদি তাদের চরিত্র_সেটিং টেবিলের সাথে যোগ না থাকে বা যদি যোগ দেওয়া রেকর্ডটিতে চরিত্র_আইড = 1 থাকে।

আপনার তাই করা উচিত

SELECT `settings`.*, `character_settings`.`value`
FROM (`settings`)
LEFT OUTER JOIN `character_settings` 
ON `character_settings`.`setting_id` = `settings`.`id`
WHERE `character_settings`.`character_id` = '1' OR
`character_settings`.character_id is NULL

7
এটি মিথ্যা ইতিবাচক প্রত্যাবর্তন ঝুঁকিপূর্ণ
ওএমজি পনিস

1
@ ওএমজিপিওনিগুলি আমি বুঝতে পারি না, এতে কী কী ক্ষেত্রে ঝুঁকি রয়েছে তা হতে পারে। আমার ক্ষেত্রে আমি যোগদানের সাথে অ্যান্ডটি প্রয়োগ করেছিলাম এবং কোনও ফলাফল ছিল না, তবে যখন আমি উপরের সমাধানটি ব্যবহার করি তখন আমার ফলাফল ছিল। তবে আমি এই বিকল্পটির সাথে যে সমস্যার মুখোমুখি হতে পারি সে সম্পর্কে আমি নিশ্চিত হতে চাই।
চেতন শর্মা

2

আপনি একটি সহজ subquery ব্যবহার করে বুঝতে সহজ হতে পারে

SELECT `settings`.*, (
    SELECT `value` FROM `character_settings`
    WHERE `character_settings`.`setting_id` = `settings`.`id`
      AND `character_settings`.`character_id` = '1') AS cv_value
FROM `settings`

সাবকিউরিটি নাল ফেরার অনুমতি দেওয়া হয়েছে, সুতরাং আপনাকে মূল ক্যোয়ারিতে JOIN / WHERE সম্পর্কে চিন্তা করতে হবে না।

কখনও কখনও, এটি মাইএসকিউএল এ দ্রুত কাজ করে, তবে আপনার পক্ষে কোনটি সবচেয়ে ভাল কাজ করে তা দেখার জন্য এটি বাম জোয়ার ফর্মের সাথে তুলনা করুন।

SELECT s.*, c.value
FROM settings s
LEFT JOIN character_settings c ON c.setting_id = s.id AND c.character_id = '1'

1

ফলাফল এসকিউএল স্টেটমেন্টের ভিত্তিতে সঠিক। বাম জোড় ডান টেবিল থেকে সমস্ত মান এবং বাম টেবিল থেকে শুধুমাত্র মান মান দেয়।

আইডি এবং NAME কলামগুলি ডান পাশের টেবিল থেকে এসেছে, তাই ফিরে আসবে।

স্কোরটি বাম টেবিল থেকে এবং 30 টি ফিরে আসবে, কারণ এই মানটি "ফ্লো" নামের সাথে সম্পর্কিত। অন্যান্য নামগুলি নুল কারণ তারা "ফ্লো" নামের সাথে সম্পর্কিত না।

নীচে আপনি যে ফলাফলটি প্রত্যাশা করেছিলেন তা ফিরে আসবে:

    SELECT  a.*, b.Score
FROM    @Table1 a
    LEFT JOIN @Table2 b
       ON a.ID = b.T1_ID 
WHERE 1=1
AND a.Name = 'Flow'

এসকিউএল ডান হাতের টেবিলে একটি ফিল্টার প্রয়োগ করে।


0

এই সমস্যার জন্য, যেমন অনান্য-তুচ্ছ বামদের সাথে যুক্ত অনেকেই যেমন অভ্যন্তরীণ-যুক্ত টেবিলগুলিতে বাম-যোগদানের সাথে যুক্ত হন, আমি ক্লোজের সাহায্যে ক্যোয়ারীটিকে বিভক্ত করার পক্ষে সুবিধাজনক এবং কিছুটা বেশি পাঠযোগ্য with। আপনার উদাহরণে,

with settings_for_char as (
  select setting_id, value from character_settings where character_id = 1
)
select
  settings.*,
  settings_for_char.value
from
  settings
  left join settings_for_char on settings_for_char.setting_id = settings.id;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.