Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Abfrage innerhalb einer Abfrage mit Überprüfung der Datenschutzbedingungen

Bitte versuchen Sie diese Abfrage (auch auf 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;

Ich habe username entfernt Feld aus posts Tabelle, da sie überflüssig ist. Außerdem habe ich Tabellen und Spalten etwas anders benannt, sodass die Abfrage möglicherweise kosmetische Änderungen für Ihr Schema benötigt.

Die erste Zeile im WHERE -Klausel diejenige ist, nach der Sie suchen, wählt sie Beiträge in der folgenden Reihenfolge aus:

  1. Erste Beiträge von Mitgliedern ohne Datenschutz;
  2. Dann Beiträge von Mitgliedern, denen der aktuelle searcher folgt;
  3. Schließlich Beiträge des Mitglieds selbst.

BEARBEITEN:

Diese Abfrage verwendet Originalkennungen:

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;

BEARBEITEN 2:

Um Duplikate zu vermeiden, falls es mehrere Follower für den Benutzer aus den posts gibt Tabellen-, Join- und Filterbedingungen sollten wie folgt geändert werden (auf 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;