sql >> Database teknologi >  >> RDS >> Mysql

mysql-forespørgsel i en forespørgsel med kontrol af privatlivets fred

Prøv venligst denne forespørgsel (også på 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;

Jeg fjernede username felt fra posts bord, da det er overflødigt. Jeg navngav også tabeller og kolonner lidt anderledes, så forespørgslen skal muligvis have kosmetiske ændringer til dit skema.

Den første linje i WHERE klausulen er den, du leder efter, den vælger indlæg i følgende rækkefølge:

  1. Første indlæg fra medlemmer uden privatliv;
  2. Derefter indlæg fra medlemmer, der efterfølges af den aktuelle searcher;
  3. Til sidst, indlæg fra medlemmet selv.

EDIT:

Denne forespørgsel bruger originale identifikatorer:

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;

EDIT 2:

For at undgå dubletter, hvis der er flere følgere for brugeren fra posts tabel, join- og filtreringsbetingelser skal ændres på følgende måde (på 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;


  1. Installation og konfiguration af MySQL på Ubuntu 20.04

  2. Konvertering af MySQL-resultater til kommaseparerede værdier

  3. FEJL 1064 (42000) i MySQL

  4. Datatabeller side 2 af paginering kalder ikke Magnific Popup