Моля, опитайте тази заявка (също на 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;
Премахнах username
поле от posts
маса, тъй като е излишна. Също така наименувах таблиците и колоните малко по-различно, така че заявката може да се нуждае от козметични промени за вашата схема.
Първият ред в WHERE
клауза е тази, която търсите, тя избира публикации в следния ред:
- Първи публикации от членове без поверителност;
- След това публикации от членове, последвани от текущия
searcher
; - Накрая, публикации на самия член.
РЕДАКТИРАНЕ:
Тази заявка използва оригинални идентификатори:
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;
РЕДАКТИРАНЕ 2:
За избягване на дублиране в случай, че има няколко последователи на потребителя от posts
условията за таблица, присъединяване и филтриране трябва да се променят по следния начин (на 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;