Ci sono 2 problemi:
- Hai bisogno di un
LEFT JOIN
sugli amici. UnLEFT JOIN
dice di restituire tutti i record dalla prima tabella nel join anche se non ci sono risultati trovati nella seconda tabella nel join. Dovresti ancheWHERE
condizioni delle clausole relative afriends
nelLEFT JOIN
clausola, in modo che le condizioni si verifichino al join. Dovresti anche usarem.id
ove possibile nei tuoi join invece di$myId
per 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
JOIN
quindi 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";