Por favor, intente esta consulta (también en 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;
Eliminé username
campo de posts
tabla, ya que es redundante. Además, nombré tablas y columnas ligeramente diferentes, por lo que es posible que la consulta necesite cambios estéticos para su esquema.
La primera línea en WHERE
cláusula es la que está buscando, selecciona las publicaciones en el siguiente orden:
- Primeras publicaciones de miembros sin privacidad;
- Luego publicaciones de miembros seguidos por el
searcher
actual; - Finalmente, publicaciones del propio miembro.
EDITAR:
Esta consulta utiliza identificadores originales:
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;
EDICIÓN 2:
Para evitar duplicados en caso de que haya varios seguidores para el usuario de las posts
Las condiciones de tabla, combinación y filtrado deben cambiarse de la siguiente manera (en 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;