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
searcher
saat 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;