Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

consulta mysql dentro de uma consulta com verificação de condição de privacidade


Por favor, tente esta consulta (também em 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;

Eu removi username campo de posts tabela, pois é redundante. Além disso, nomeei tabelas e colunas ligeiramente diferentes, portanto, a consulta pode precisar de alterações cosméticas para seu esquema.

A primeira linha no WHERE cláusula é a que você está procurando, ela seleciona as postagens na seguinte ordem:
  1. Primeiras postagens de membros sem privacidade;
  2. Em seguida, postagens de membros que são seguidos pelo searcher atual;
  3. Finalmente, postagens do próprio membro.

EDITAR:

Esta consulta está usando identificadores originais:
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;

EDIÇÃO 2:

Para evitar duplicatas caso haja vários seguidores para o usuário das posts tabela, as condições de junção e filtragem devem ser alteradas da seguinte maneira (em 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;