Saat Anda menggunakan gabungan luar, dan kemudian menggunakan salah satu kolom "luar" dalam pemeriksaan kesetaraan di WHERE
klausa, Anda mengubah gabungan luar Anda menjadi gabungan dalam. Ini karena kondisi Anda yang memeriksa privasi kiriman mengharuskan kiriman tersebut ada di sana:
AND p.privacy = 1 OR (p.privacy = 2 AND fr.fstatus = 1)
Ketika gabungan luar akan menghasilkan baris yang sesuai dengan pemberitahuan tanpa pos, itu akan memeriksa kondisi di atas. Karena pos tidak ada di sana, p.privacy
akan mengevaluasi ke NULL
, "mencemari" kedua sisi OR
, dan akhirnya membuat seluruh kondisi dievaluasi menjadi false
.
Pindahkan kondisi ini ke ON
kondisi bergabung akan memperbaiki masalah:
SELECT
u.username AS sender,
ux.username AS receiver,
p.id
FROM notifications n
JOIN follows f ON (n.user_id = f.tofollow_id)
JOIN follows fr ON (n.tonotify_id = fr.tofollow_id)
JOIN user u ON (u.id = n.user_id)
JOIN user ux ON (ux.id = n.tonotify_id)
LEFT JOIN posts p ON (n.posts_id = p.id)
AND (p.privacy = 1 OR (p.privacy = 2 AND fr.fstatus = 1))
WHERE f.user_id = 1
AND fr.user_id = 1
AND f.status = 1
ORDER BY n.id DESC
Cara lain untuk memperbaikinya adalah dengan menambahkan IS NULL
kondisi ke OR
. Anda , seperti ini:
SELECT
u.username AS sender,
ux.username AS receiver,
p.id
FROM notifications n
JOIN follows f ON (n.user_id = f.tofollow_id)
JOIN follows fr ON (n.tonotify_id = fr.tofollow_id)
JOIN user u ON (u.id = n.user_id)
JOIN user ux ON (ux.id = n.tonotify_id)
LEFT JOIN posts p ON (n.posts_id = p.id)
WHERE f.user_id = 1
AND fr.user_id = 1
AND f.status = 1
AND (p.privacy IS NULL OR p.privacy = 1 OR (p.privacy = 2 AND fr.fstatus = 1))
ORDER BY n.id DESC