Prøv venligst denne forespørgsel (også på 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;
Jeg fjernede username
felt fra posts
bord, da det er overflødigt. Jeg navngav også tabeller og kolonner lidt anderledes, så forespørgslen skal muligvis have kosmetiske ændringer til dit skema.
Den første linje i WHERE
klausulen er den, du leder efter, den vælger indlæg i følgende rækkefølge:
- Første indlæg fra medlemmer uden privatliv;
- Derefter indlæg fra medlemmer, der efterfølges af den aktuelle
searcher
; - Til sidst, indlæg fra medlemmet selv.
EDIT:
Denne forespørgsel bruger originale identifikatorer:
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;
EDIT 2:
For at undgå dubletter, hvis der er flere følgere for brugeren fra posts
tabel, join- og filtreringsbetingelser skal ændres på følgende måde (på 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;