sql >> Base de Datos >  >> RDS >> Mysql

consulta mysql dentro de una consulta con verificación de condición de privacidad

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:

  1. Primeras publicaciones de miembros sin privacidad;
  2. Luego publicaciones de miembros seguidos por el searcher actual;
  3. 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;