sql >> Databasteknik >  >> RDS >> Mysql

Gå med i flera bord och behåll NULL

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


  1. Säkerhetsundantag med MySQL och Entity Framework på godaddy

  2. php:SQLSTATE[HY000] [2002] Ingen anslutning kunde göras eftersom måldatorn aktivt vägrade det

  3. Webbseminarium:Banking on Postgres – Finansiella tillämpningsöverväganden [Uppföljning]

  4. YEAR() Exempel – MySQL