När du använder en yttre sammanfogning och sedan använder en av de "yttre" kolumnerna i en likhetskontroll i WHERE
sats, konverterar du din yttre koppling till en inre koppling. Detta beror på att ditt tillstånd som kontrollerar inläggets integritet kräver att inlägget finns där:
AND p.privacy = 1 OR (p.privacy = 2 AND fr.fstatus = 1)
När en yttre sammanfogning är på väg att producera en rad som motsvarar ett meddelande utan ett inlägg, skulle den kontrollera ovanstående villkor. Eftersom inlägget inte finns där, p.privacy
skulle utvärderas till NULL
, "kontaminerar" båda sidor av OR
, och så småningom få hela villkoret att utvärderas till false
.
Flyttar detta tillstånd till ON
villkoret för anslutningen kommer att lösa problemet:
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
Ett annat sätt att fixa detta är att lägga till en IS NULL
skick till din OR
, så här:
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