2 समस्याएं हैं:
- आपको एक
LEFT JOIN
की आवश्यकता है दोस्तों पर। एकLEFT JOIN
शामिल होने में पहली तालिका से सभी रिकॉर्ड वापस करने के लिए कहते हैं, भले ही शामिल होने में दूसरी तालिका में कोई परिणाम न मिले। आपकोWHERE
भी करना चाहिएfriends
. से संबंधित खंड की शर्तेंLEFT JOIN
. में खंड, ताकि शामिल होने पर स्थितियां उत्पन्न हों। आपकोm.id
. का भी उपयोग करना चाहिए$myId
. के बजाय आपके जॉइन में जहां भी संभव हो अतिरेक को खत्म करने के लिए। - आपका WHERE क्लॉज बहुत अधिक प्रतिबंधात्मक (अनावश्यक शर्तें) है। हमेशा संभव स्थितियों के सबसे सरल सेट का उपयोग करें, और
JOIN
. पर जितने उपयुक्त हों, डाल दें इसलिए उन्हें पढ़ना आसान होता है।
उदाहरण (दोस्तों से भी पोस्ट जोड़ने के लिए संपादित):
$query = "SELECT DISTINCT `u`.`id`, `p`.`byuser`, `p`.`newpost`, `p`.`id`, `p`.`postdate`
FROM `users` AS `u`
LEFT JOIN `friends` AS `f`
ON `f`.`userid` = `u`.`id`
OR `f`.`friendid` = `u`.`id`
JOIN `pinnwand` AS `p`
/* This will get all posts made by the user */
ON `p`.`byuser` = `u`.`id`
/* This will get all posts made TO the user by friends */
OR (`p`.`byuser` IN (`f`.`userid`, `f`.`friendid`)
AND `p`.`touser` = `u`.`id`)
WHERE `u`.`id` = {$myId}
AND `p`.`publicp` < 3
AND `p`.`typ` = 2
ORDER BY `p`.`id` DESC
LIMIT {$limit}, 10";