Existují 2 problémy:
- Potřebujete
LEFT JOIN
na přátelích.LEFT JOIN
říká, že se mají vrátit všechny záznamy z první tabulky ve spojení, i když nebyly nalezeny žádné výsledky v druhé tabulce spojení. Měli byste takéWHERE
podmínky klauzule týkající sefriends
doLEFT JOIN
klauzule, aby podmínky nastaly při spojení. Měli byste také používatm.id
kdekoli je to možné ve vašich spojeních namísto$myId
k odstranění redundance. - Vaše klauzule WHERE je příliš omezující (nadbytečné podmínky). Vždy používejte co nejjednodušší sadu podmínek a do
JOIN
vložte tolik, kolik je vhodné takže se lépe čtou.
Příklad (upraveno pro přidání příspěvků také od přátel):
$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";