Veuillez essayer cette requête (également sur 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;
J'ai supprimé username
champ de posts
tableau, car il est redondant. De plus, j'ai nommé les tables et les colonnes légèrement différemment, donc la requête peut nécessiter des changements cosmétiques pour votre schéma.
La première ligne dans WHERE
clause est celle que vous recherchez, elle sélectionne les publications dans l'ordre suivant :
- Premiers messages de membres sans confidentialité ;
- Ensuite, les messages des membres qui sont suivis par le
searcher
actuel; - Enfin, les messages du membre lui-même.
MODIF :
Cette requête utilise les identifiants d'origine :
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;
MODIFICATION 2 :
Pour éviter les doublons au cas où il y aurait plusieurs followers pour l'utilisateur à partir des posts
les conditions de table, de jointure et de filtrage doivent être modifiées de la manière suivante (sur 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;