Silakan, coba kueri ini (juga di 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;
Saya menghapus username bidang dari posts tabel, karena berlebihan. Selain itu, saya menamai tabel dan kolom sedikit berbeda, jadi kueri mungkin memerlukan perubahan kosmetik untuk skema Anda.
Baris pertama di WHERE klausa adalah salah satu yang Anda cari, ia memilih posting dalam urutan berikut:
- Postingan pertama dari anggota tanpa privasi;
- Kemudian posting dari anggota yang diikuti oleh
searchersaat ini; - Akhirnya, postingan dari anggota itu sendiri.
EDIT:
Kueri ini menggunakan pengenal asli:
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;
EDIT 2:
Untuk menghindari duplikat jika ada beberapa pengikut untuk pengguna dari posts tabel, bergabung dan menyaring kondisi harus diubah dengan cara berikut (pada 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;