Има 2 проблема:
- Имате нужда от
LEFT JOIN
на приятели. ALEFT 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";