Bạn cần đưa người dùng kiểm tra tham gia, không phải ở nơi có điều kiện như vậy:
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
Lý do của việc này là JOINS sử dụng "kết nối bên trái" (ngầm hiểu là kết nối bên ngoài ". Kiểu kết nối này có nghĩa là nếu điều kiện hoạt động, hãy trả về tất cả dữ liệu cột cho bảng đó cho hàng đó .. nếu toàn bộ điều kiện không hoạt động, nó sẽ trả về tất cả dữ liệu cho các bảng được đề cập trước đó, nhưng đối với bảng được đề cập trong hàng, nó sẽ trả về NULLS cho tất cả các cột đó.
Tôi xin lỗi vì mô tả đó, vì thật khó diễn đạt thành lời chính xác cách thức hoạt động của một phép nối phức tạp bên ngoài (hoặc bên trái) mà không trở nên dài dòng.