Są 2 problemy:
- Potrzebujesz
LEFT JOIN
na przyjaciół.LEFT JOIN
mówi, aby zwrócić wszystkie rekordy z pierwszej tabeli w łączeniu, nawet jeśli nie znaleziono wyników w drugiej tabeli w łączeniu. Powinieneś takżeWHERE
warunki klauzuli dotyczącefriends
doLEFT JOIN
klauzuli, tak aby warunki wystąpiły przy łączeniu. Powinieneś także używaćm.id
wszędzie tam, gdzie jest to możliwe w twoich sprzężeniach zamiast$myId
aby wyeliminować nadmiarowość. - Twoja klauzula WHERE jest zbyt restrykcyjna (nadmiarowe warunki). Zawsze używaj najprostszego możliwego zestawu warunków i umieść tyle, ile potrzeba w
JOIN
dzięki czemu są łatwiejsze do odczytania.
Przykład (edytowany w celu dodawania postów również od znajomych):
$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";