कृपया, इस क्वेरी को आजमाएं (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;
मैंने username
removed हटा दिया 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;