Có 2 vấn đề:
- Bạn cần một
LEFT JOINtrên bạn bè.LEFT JOINcho 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 đếnfriendsvà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.idbấ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";