Vui lòng thử truy vấn này (cũng trên SQL Fiddle ):
SELECT p.id, p.user_id, m.username, m.privacy,
searcher.username "Searcher", p.status_msg
FROM posts p
JOIN members m ON m.id = p.user_id
LEFT JOIN following f ON p.user_id = f.user_id
JOIN members searcher ON searcher.username = 'userA'
WHERE (m.privacy = 0 OR (m.privacy = 1 AND f.follower_id = searcher.id)
OR m.id = searcher.id)
AND p.status_msg LIKE '%New%'
ORDER BY p.id
LIMIT 5;
Tôi đã xóa username
trường từ posts
bảng, vì nó là thừa. Ngoài ra, tôi đã đặt tên cho các bảng và cột hơi khác một chút, vì vậy truy vấn có thể cần các thay đổi thẩm mỹ cho giản đồ của bạn.
Dòng đầu tiên trong WHERE
là mệnh đề mà bạn đang tìm kiếm, nó chọn các bài đăng theo thứ tự sau:
- Bài đăng đầu tiên của các thành viên không có quyền riêng tư;
- Sau đó, các bài đăng từ các thành viên được theo dõi bởi
searcher
hiện tại; - Cuối cùng là các bài đăng của chính thành viên đó.
CHỈNH SỬA:
Truy vấn này đang sử dụng số nhận dạng ban đầu:
SELECT p.id, p.`userID`, m.username, m.privacy,
searcher.username "Searcher", p.`statusMsg`
FROM posts p
JOIN `myMembers` m ON m.id = p.`userID`
LEFT JOIN following f ON p.`userID` = f.user_id
JOIN `myMembers` searcher ON searcher.username = 'userD'
WHERE (m.privacy = 0 OR f.follower_id = searcher.id OR m.id = searcher.id)
AND p.`statusMsg` LIKE '%New%'
ORDER BY p.id
LIMIT 5;
CHỈNH SỬA 2:
Để tránh trùng lặp trong trường hợp có một số người theo dõi người dùng từ posts
bảng, nối và điều kiện lọc phải được thay đổi theo cách sau (trên SQL Fiddle ):
SELECT p.id, p.user_id, m.username, m.privacy,
searcher.username "Searcher", p.status_msg
FROM posts p
JOIN members m ON m.id = p.user_id
JOIN members searcher ON searcher.username = 'userC'
LEFT JOIN following f ON p.user_id = f.user_id
AND follower_id = searcher.id
WHERE (m.privacy = 0 OR (m.privacy = 1 AND f.id IS NOT NULL)
OR m.id = searcher.id)
ORDER BY p.id
LIMIT 5;