Il y a 2 problèmes :
- Vous avez besoin d'un
LEFT JOIN
sur des amis. UneLEFT JOIN
indique de renvoyer tous les enregistrements de la première table de la jointure même s'il n'y a aucun résultat trouvé dans la deuxième table de la jointure. Vous devez également indiquerWHERE
clause conditions relatives auxfriends
dans leLEFT JOIN
clause, de sorte que les conditions se produisent à la jointure. Vous devriez également utiliserm.id
dans la mesure du possible dans vos jointures au lieu de$myId
pour éliminer la redondance. - Votre clause WHERE est trop restrictive (conditions redondantes). Utilisez toujours l'ensemble de conditions le plus simple possible et mettez-en autant que nécessaire dans le
JOIN
afin qu'ils soient plus faciles à lire.
Exemple (Modifié pour ajouter également des publications d'amis) :
$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";