Probeer deze zoekopdracht alstublieft (ook op 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;
Ik heb username
verwijderd veld van posts
tafel, omdat deze overbodig is. Ook heb ik tabellen en kolommen een iets andere naam gegeven, dus het kan zijn dat de query cosmetische wijzigingen voor je schema nodig heeft.
De eerste regel in de WHERE
clausule is degene die je zoekt, het selecteert berichten in de volgende volgorde:
- Eerste berichten van leden zonder privacy;
- Vervolgens berichten van leden die worden gevolgd door de huidige
searcher
; - Eindelijk, berichten van het lid zelf.
BEWERKEN:
Deze zoekopdracht gebruikt originele ID's:
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;
BEWERK 2:
Om duplicaten te voorkomen als er meerdere volgers zijn voor de gebruiker van de posts
tabel, join en filtervoorwaarden moeten op de volgende manier worden gewijzigd (op 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;