Ci sono 2 problemi:
- Hai bisogno di un
LEFT JOINsugli amici. UnLEFT JOINdice di restituire tutti i record dalla prima tabella nel join anche se non ci sono risultati trovati nella seconda tabella nel join. Dovresti ancheWHEREcondizioni delle clausole relative afriendsnelLEFT JOINclausola, in modo che le condizioni si verifichino al join. Dovresti anche usarem.idove possibile nei tuoi join invece di$myIdper eliminare la ridondanza. - La tua clausola WHERE è troppo restrittiva (condizioni ridondanti). Usa sempre l'insieme di condizioni più semplice possibile e inseriscine il numero appropriato in
JOINquindi sono più facili da leggere.
Esempio (modificato anche per aggiungere post di amici):
$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";