मेरे पास मेरी साइट पर खातों की जानकारी रखने वाली प्रोफाइल वाली एक तालिका है। उदा. विभिन्न पृष्ठों पर किसी प्रोफ़ाइल का प्रचार करना संभव है. एक समाप्ति तिथि तक खोज पृष्ठ और फ्रंटपेज।

प्रचार प्रोफ़ाइल_प्रोमो तालिका में संग्रहीत हैं और प्रोफ़ाइल_आईडी द्वारा शामिल किए गए हैं।

मेरी समस्या यह है कि खोज पृष्ठ पर मैं सभी प्रोफाइल दिखाना चाहता हूं और प्रचार तालिका के साथ जुड़ना चाहता हूं

LEFT JOIN profile_promotion pp ON pp.profile_id = profile.id 
WHERE (pp.page = 'search' OR pp.page is NULL) and pp.expire >= now()

यह तब तक ठीक काम करता है जब तक खोज पृष्ठ पर कोई प्रचार होता है या यदि कोई प्रचार नहीं होता है।

यदि केवल मुखपृष्ठ पर कोई प्रचार है, तो WHERE के कारण मुझे अपने खोज पृष्ठ के लिए कोई भी परिणाम नहीं मिलता है।

लेकिन मैं अभी भी प्रोफ़ाइल से जानकारी चाहता हूं, भले ही पदोन्नति हो या न हो। ध्यान दें, कि एक प्रोफ़ाइल का एक ही समय में कई पृष्ठों पर प्रचार हो सकता है (हो सकता है कि इससे कुछ तर्क बदल जाए)

मैं SQL में अच्छा नहीं हूँ तो मैं इसे कैसे हल करूँ?

sql
2
Christian 21 मार्च 2020, 14:21
3
WHERE क्लॉज़ की शर्तों को ON क्लॉज़ पर ले जाएँ।
 – 
forpas
21 मार्च 2020, 14:23
इसने चाल चली, धन्यवाद
 – 
Christian
21 मार्च 2020, 14:38

2 जवाब

लेफ्ट जॉइन के साथ क्लॉज का उपयोग करके इसे अंततः इनर जॉइन में बदल दिया जाता है। आपको अपनी शर्तों को इस प्रकार समायोजित करने की आवश्यकता है -

LEFT JOIN profile_promotion pp ON pp.profile_id = profile.id 
                               AND (pp.page = 'search' OR pp.page is NULL)
                               AND pp.expire >= now()
1
Ankit Bajpai 21 मार्च 2020, 14:27
धन्यवाद, यह काम करता है। लेकिन ऐसा नहीं लगता कि मुझे "या पीपी.पेज न्यूल है" की आवश्यकता है :)
 – 
Christian
21 मार्च 2020, 14:39
तब आप उस शर्त को हटा सकते हैं।
 – 
Ankit Bajpai
21 मार्च 2020, 14:51

जैसा कि अब आप जानते हैं कि गैर-समाप्ति से मेल खाने का सही तर्क है, "खोज" प्रचार है:

FROM profile p LEFT JOIN
     profile_promotion pp
     ON pp.profile_id = p.id  AND
        pp.page = 'search' AND
        pp.expire >= now()

एक LEFT JOIN का तर्क यह है कि यह पहली तालिका में सभी पंक्तियों को लौटाता है, तब भी जब ON स्थितियां NULL का मूल्यांकन करती हैं।

इस कारण से, दूसरी तालिका पर फ़िल्टर करने की शर्तें ON खंड में होनी चाहिए। प्रथम तालिका में फ़िल्टर करने की शर्तें केवल WHERE खंड में होनी चाहिए।

तुम्हारा कोड:

FROM profile p LEFT JOIN
     profile_promotion pp
     ON pp.profile_id = p.id  AND
WHERE (pp.page = 'search' OR pp.page is NULL) AND
      pp.expire >= now()

दूसरी शर्त के कारण इसे INNER JOIN में बदल देता है। जब LEFT JOIN को कोई मेल नहीं मिलता, तो pp.expire NULL हो जाएगा और कंडीशन फेल हो जाएगी।

आप ऐसा करके इसके आसपास जाने की कोशिश कर सकते हैं:

WHERE (pp.page = 'search' OR pp.page is NULL) AND
      (pp.expire >= now() OR pp.expire IS NULL)

हालाँकि, यह अभी भी वही तर्क नहीं है। यह तब पकड़ में आएगा जब pp में बिल्कुल भी मेल न हो। हालांकि, जब कोई मैच होगा तो यह वह नहीं करेगा जो आप चाहते हैं, लेकिन search के लिए नहीं।

0
Gordon Linoff 21 मार्च 2020, 16:41