जब आप बाहरी जुड़ाव का उपयोग करते हैं, और फिर WHERE
में समानता जांच में "बाहरी" कॉलम में से किसी एक का उपयोग करते हैं क्लॉज, आप अपने बाहरी जुड़ाव को आंतरिक जुड़ाव में बदल देते हैं। ऐसा इसलिए है क्योंकि आपकी स्थिति जो पोस्ट की गोपनीयता की जांच करती है, उसके लिए पोस्ट का होना आवश्यक है:
AND p.privacy = 1 OR (p.privacy = 2 AND fr.fstatus = 1)
जब एक बाहरी जुड़ाव एक पंक्ति उत्पन्न करने वाला होता है जो बिना किसी पोस्ट के अधिसूचना से मेल खाता है, तो यह उपरोक्त स्थिति की जांच करेगा। चूँकि पोस्ट वहाँ नहीं है, p.privacy
NULL
. का मूल्यांकन करेगा , OR
. के दोनों पक्षों को "दूषित" करना , और अंततः पूरी स्थिति का मूल्यांकन false
. करने के लिए किया जाता है ।
इस शर्त को ON
में ले जाना शामिल होने की स्थिति समस्या का समाधान करेगी:
SELECT
u.username AS sender,
ux.username AS receiver,
p.id
FROM notifications n
JOIN follows f ON (n.user_id = f.tofollow_id)
JOIN follows fr ON (n.tonotify_id = fr.tofollow_id)
JOIN user u ON (u.id = n.user_id)
JOIN user ux ON (ux.id = n.tonotify_id)
LEFT JOIN posts p ON (n.posts_id = p.id)
AND (p.privacy = 1 OR (p.privacy = 2 AND fr.fstatus = 1))
WHERE f.user_id = 1
AND fr.user_id = 1
AND f.status = 1
ORDER BY n.id DESC
इसे ठीक करने का दूसरा तरीका एक IS NULL
जोड़ना होगा आपके OR
. के लिए शर्त , इस तरह:
SELECT
u.username AS sender,
ux.username AS receiver,
p.id
FROM notifications n
JOIN follows f ON (n.user_id = f.tofollow_id)
JOIN follows fr ON (n.tonotify_id = fr.tofollow_id)
JOIN user u ON (u.id = n.user_id)
JOIN user ux ON (ux.id = n.tonotify_id)
LEFT JOIN posts p ON (n.posts_id = p.id)
WHERE f.user_id = 1
AND fr.user_id = 1
AND f.status = 1
AND (p.privacy IS NULL OR p.privacy = 1 OR (p.privacy = 2 AND fr.fstatus = 1))
ORDER BY n.id DESC