आपको उपयोगकर्ता चेक को जॉइन में रखना होगा, न कि उस स्थिति में जहां ऐसा है:
SELECT c.course_id,l.topic,l.id,l.vid_duration,p.*
FROM courses c
LEFT JOIN lessons l ON l.course_id=c.course_id
LEFT JOIN progress p ON l.id = p.lesson_id and p.user_id = :userid
WHERE c.slug = :course
ऐसा करने का कारण यह है कि जॉइन "लेफ्ट जॉइन" का उपयोग करता है (जो परोक्ष रूप से एक बाहरी जॉइन है। इस प्रकार के जॉइन का मतलब है कि अगर कंडीशन काम करती है, तो उस टेबल के लिए उस रो के लिए सभी कॉलम डेटा वापस कर दें। कंडीशन काम नहीं करती है, यह पहले बताई गई टेबल का सारा डेटा लौटा देगी, लेकिन पंक्ति में बताई गई टेबल के लिए, यह उन सभी कॉलम के लिए NULLS लौटा देगी।
मैं उस विवरण के लिए क्षमा चाहता हूं, क्योंकि यह शब्दों में बयां करना मुश्किल है कि एक जटिल बाहरी (या बाएं) कैसे जुड़ता है बिना चिंता के काम करता है।