Es gibt 2 Probleme:
- Du brauchst einen
LEFT JOIN
auf Freunde. EinLEFT JOIN
besagt, dass alle Datensätze aus der ersten Tabelle im Join zurückgegeben werden sollen, auch wenn in der zweiten Tabelle im Join keine Ergebnisse gefunden werden. Sie sollten auchWHERE
angeben Klauselbedingungen in Bezug auffriends
in denLEFT JOIN
-Klausel, sodass die Bedingungen beim Join auftreten. Sie sollten auchm.id
verwenden wo immer möglich in Ihren Joins anstelle von$myId
um Redundanzen zu eliminieren. - Ihre WHERE-Klausel ist zu restriktiv (redundante Bedingungen). Verwenden Sie immer den einfachsten Satz von Bedingungen und geben Sie so viele wie nötig beim
JOIN
ein damit sie leichter zu lesen sind.
Beispiel (bearbeitet, um auch Beiträge von Freunden hinzuzufügen):
$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";