このクエリを試してください( SQLFiddle でも試してください。 ):
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;
username
を削除しました posts
のフィールド 冗長であるため、テーブル。また、テーブルと列の名前を少し異なるため、スキーマの外観を変更する必要がある場合があります。
WHERE
の最初の行 句はあなたが探しているものであり、次の順序で投稿を選択します:
- プライバシーのないメンバーからの最初の投稿;
- 次に、現在の
searcher
が続くメンバーからの投稿; - 最後に、メンバー自身の投稿。
編集:
このクエリは元の識別子を使用しています:
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;
編集2:
posts
からユーザーのフォロワーが複数いる場合に重複を避けるため テーブル、結合、およびフィルタリングの条件は、次のように変更する必要があります( 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;