SQL: Vilken join istället för subquery?

Trädvy Permalänk
Medlem
Plats
Halmstad
Registrerad
Apr 2003

SQL: Vilken join istället för subquery?

Tja!

Jag verkar ha lite hjärnsläpp. Jag vill enbart visa bilder som ännu INTE har bifogats i ett specifikt nyhetsinlägg.

Har 2st tabeller som problemet berör, det ena är:

NewsPosts Där den enda relevanta kolumen är:
PostID

Tabellen för bifogade bilder är:

NewsPostsPhotos Med kolumnerna:
PostPhotoPostID (nyhetsinlägget som bilden är bifogad i)
PostPhotoID (bilden som är bifogad)

NewsPosts är en gemensam tabell för både nyhetsinlägg & uppladdade bilder (url till bilderna på servern), enda skillnaden mellan dom 2 är att bilderna har en PostType = 'Photo' & nyhetsinläggen har PostType = 'Post'

Om jag vill bifoga en redan uppladdad bild till ett nyhetsinlägg så lägger jag ju bara in relevant info i NewsPostsPhotos så 1 bild kan vara bifogad till flera nyhetsinlägg.

MEN när man skall bifoga bilder inne i ett nyhetsinlägg så vill jag inte att bilderna som redan har bifogats till nyhetsinlägget skall synas.

Den queryn jag kör nu är:

SELECT * FROM NewsPosts WHERE PostID NOT IN ( SELECT PostPhotoID FROM NewsPostsPhotos WHERE PostPhotoPostID = :PostPhotoPostID ) AND PostType = 'Photo'

:PostPhotoPostID är PostID för det nyhetsinlägget man för tillfället kollar på.

Usch vad otydligt & rörigt detta blev.

Subqueryn böjar bli relativt slö trots att jag har index på det som behövs, tänkte testa om jag kan få lite bättre prestanda med joins istället men får inte till min join query.

Har testat flera olika, tex:

SELECT * FROM NewsPosts LEFT JOIN NewsPostsPhotos ON PostID = PostPhotoID WHERE PostPhotoPostID NOT IN (:PostPhotoPostID) AND PostType = 'Photo'

Detta fungerar NÄSTAN, visst, den visar bilder som inte redan är bifogade i nyhetsinlägget & visar inte bilder som redan är bifogade MED UNDANTAG för dom bilderna som också råkar vara bifogade 2 ggr. Dessutom, säg i nyhetsinlägg som inte har några bifogade bilder alls så kommer ju vissa bilder att dupliceras så många gånger som dom har blivit bifogade, så har dom blivit bifogade i 5 nyhetsinlägg så kommer ju bilderna att visas 5 ggr

Så japp, kan någon peka mig åt rätt håll för nu har det blivit lite väl galet

Hur kan syltkakor överleva i det vilda utan ögon?

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Jun 2010

SELECT * FROM NewsPosts LEFT JOIN NewsPostsPhotos ON PostID = PostPhotoID WHERE NewsPostsPhotos.PostPhotoID IS NULL

Trädvy Permalänk
Medlem
Plats
Halmstad
Registrerad
Apr 2003
Skrivet av snajk:

SELECT * FROM NewsPosts LEFT JOIN NewsPostsPhotos ON PostID = PostPhotoID WHERE NewsPostsPhotos.PostPhotoID IS NULL

Tack för svaret, tyvärr visas inga bilder alls med den querien. Har testat flera olika modifieringar men får inte till det :S

Hur kan syltkakor överleva i det vilda utan ögon?

Trädvy Permalänk
Medlem
Plats
Göteborg
Registrerad
Maj 2004

Om jag förstått problemet, så borde detta fungera: http://sqlfiddle.com/#!6/cfc18/2

DECLARE @CurrentPostID INT = 3 -- Id du vill hämta lista över bilder för. SELECT * FROM NewsPosts AS Photos LEFT JOIN NewsPostsPhotos NPP ON NPP.PostPhotoID = Photos.PostID AND NPP.PostPhotoPostID = @CurrentPostID WHERE Photos.PostType = 'Photo' AND NPP.PostPhotoID IS NULL

as far as we can tell, the massacre went well...

Trädvy Permalänk
Medlem
Plats
Halmstad
Registrerad
Apr 2003
Skrivet av jovnas:

Om jag förstått problemet, så borde detta fungera: http://sqlfiddle.com/#!6/cfc18/2

DECLARE @CurrentPostID INT = 3 -- Id du vill hämta lista över bilder för. SELECT * FROM NewsPosts AS Photos LEFT JOIN NewsPostsPhotos NPP ON NPP.PostPhotoID = Photos.PostID AND NPP.PostPhotoPostID = @CurrentPostID WHERE Photos.PostType = 'Photo' AND NPP.PostPhotoID IS NULL

Tack så mycket, verkar fungera precis så som jag ville, vet inte vad det är med min hjärna, SQL är ofta relativt enkelt men såfort JOINS kommer in i bilden så kopplar min hjärna bort helt, vet inte vad det är, känns onaturligt på något sätt, inte lika illa som regex men inte långt ifrån.

Har suttit i 10-20 minuter nu & försökt förstå hur den queryn fungerar men har svårt att förstå vad som händer vid AND satsen på joinen & hur den får "tomma" joins så man kan köra "NPP.PostPhotoID IS NULL". Får träna på JOINS helt enkel.

Tack tack

Hur kan syltkakor överleva i det vilda utan ögon?