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:
- Erste Beiträge von Mitgliedern ohne Datenschutz;
- Dann Beiträge von Mitgliedern, denen der aktuelle
searcher
folgt; - 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;