Pröva den här frågan (även 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;
Jag tog bort username
fält från posts
bord, eftersom det är överflödigt. Jag namngav också tabeller och kolumner något annorlunda, så frågan kan behöva kosmetiska ändringar för ditt schema.
Den första raden i WHERE
satsen är den du letar efter, den väljer inlägg i följande ordning:
- Första inlägg från medlemmar utan sekretess;
- Inlägg sedan från medlemmar som följs av den nuvarande
searcher
; - Slutligen, inlägg från medlemmen själv.
EDIT:
Den här frågan använder ursprungliga identifierare:
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:
För att undvika dubbletter om det finns flera följare för användaren från posts
tabell, join och filtreringsvillkor bör ändras på följande sätt (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;