sql >> Database >  >> RDS >> Mysql

mysql-query binnen een query met controle van de privacyvoorwaarden

Probeer deze zoekopdracht alstublieft (ook op 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;

Ik heb username verwijderd veld van posts tafel, omdat deze overbodig is. Ook heb ik tabellen en kolommen een iets andere naam gegeven, dus het kan zijn dat de query cosmetische wijzigingen voor je schema nodig heeft.

De eerste regel in de WHERE clausule is degene die je zoekt, het selecteert berichten in de volgende volgorde:

  1. Eerste berichten van leden zonder privacy;
  2. Vervolgens berichten van leden die worden gevolgd door de huidige searcher;
  3. Eindelijk, berichten van het lid zelf.

BEWERKEN:

Deze zoekopdracht gebruikt originele ID's:

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;

BEWERK 2:

Om duplicaten te voorkomen als er meerdere volgers zijn voor de gebruiker van de posts tabel, join en filtervoorwaarden moeten op de volgende manier worden gewijzigd (op 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. Postgres kolom toevoegen met aanvankelijk berekende waarden

  2. MySQL Stored Procedures werken niet met SELECT (basisvraag)

  3. Waarden krijgen die geen cijfers bevatten in SQL Server

  4. Moet ik de tijdzone apart opslaan van de tijdstempel voor Postgres en JDBC?