Có 2 vấn đề:
- Bạn cần một
LEFT JOIN
trên bạn bè.LEFT JOIN
cho biết trả về tất cả các bản ghi từ bảng đầu tiên trong phép nối ngay cả khi không có kết quả nào được tìm thấy trong bảng thứ hai trong phép nối. Bạn cũng nênWHERE
điều kiện điều khoản liên quan đếnfriends
vàoLEFT JOIN
, để các điều kiện xảy ra tại phép nối. Bạn cũng nên sử dụngm.id
bất cứ khi nào có thể bằng cách tham gia của bạn thay vì$myId
để loại bỏ sự dư thừa. - Mệnh đề WHERE của bạn quá hạn chế (điều kiện thừa). Luôn sử dụng bộ điều kiện đơn giản nhất có thể và đặt càng nhiều điều kiện càng thích hợp tại
JOIN
để chúng dễ đọc hơn.
Ví dụ (Đã chỉnh sửa để thêm bài đăng từ bạn bè):
$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";