Mysql
 sql >> Base de données >  >> RDS >> Mysql

requête mysql dans une requête avec vérification des conditions de confidentialité

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 :

  1. Premiers messages de membres sans confidentialité ;
  2. Ensuite, les messages des membres qui sont suivis par le searcher actuel;
  3. 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;