webForumDet fria alternativet

Vill ha en post i recordsetet, oavsett antal bilder i artikeln

Databaser & SQL

8 svar · 435 visningar · startad av JonasG

Medlem sedan mars 2001148 inlägg
Frågan#1

Efter att ha letat runt ordentligt på webforum utan att hitta svaret, frågar jag nu. Svaret finns här säkert, men jag har inte lyckats läsa ut det, är lite för dålig på SQL än så länge...

Har en artikel-tabell och en bild-tabell. För varje artikel kan det finnas ingen eller flera bilder. Dessa identifieras ihop med artikel.id = bild.artikelId.

Jag vill nu få upp en lista över alla artiklar och bara vet om artikeln har någon bild eller ej, kvittar hur många.

SELECT artikel.id, bild.bild FROM artikel
LEFT JOIN bild ON bild.artikelId = artikel.id
ORDER BY id DESC

Det fungerar ju bra, men recordsetet innehåller då lika många poster för samma artikel, som artikeln har bilder.

Hur löser jag detta? Jag vill bara veta alltså om artikeln har några bilder eller ej. Kikat runt på IN och CASE och tjoflöjt men inte hittat det klockrena exemplet där till och med jag förstår.

Måste köpa en SQL-bok och börja från grunden...

Medlem sedan nov. 20017 144 inlägg
#2
SELECT distinct artikel.id, bild.bild, 
CASE WHEN bild.artikelId IS NULL THEN 'Ingen bild' ELSE 'Bild' END AS bild 
FROM artikel
LEFT JOIN bild ON bild.artikelId = artikel.id
ORDER BY id DESC
Medlem sedan mars 2001148 inlägg
#3

Tack för svaret.
Men enda skillnaden för mig blir den att "bild" blir "Bild" eller "Ingen bild".
Fortfarande visas samma artikel flera gånger i rec-setet, så många gånger som den har bild. Och i de fall det inte finns någon bild, eller en bild, bara en gång naturligtvis.

Distinct har alltså ingen funktion i mitt läge? Detta eftersom det är olika bilder. Byter jag namn i tabellen på en bild, så att en artikel innehåller två bilder som heter samma sak, då går distinct in och visar bara en.

Jag vill ha en distinct som gör att artikel.id bara blir en. Så att säga.

Medlem sedan nov. 20017 144 inlägg
#4
SELECT artikel.id, bild.bild, 
CASE WHEN exists(SELECT artikelId FROM bild WHERE bild.artikelId = artikel.id) THEN 'Bild' ELSE 'Ingen bild' END AS bild
FROM artikel
ORDER BY id DESC
Medlem sedan nov. 20017 144 inlägg
#5

1. Tänk på att det finns ett sql-forum här på WF.
2. Uppge alltid DBMS (mySql innan 4.x (har jag för mig) fixar inte subquerys)

Medlem sedan mars 2001148 inlägg
#6

Ja tråden hade nog passat bättre i sql-forumet. Svårt att skilja på saker när man sitter och knackar. :-P

Får ett fel meddelande med din senaste kod.

Du har något fel i din syntax nära 'exists(SELECT artikelId FROM bild WHERE bild.artikelId = artikel.id) THEN

Jag har tydligen MySQL 4.0.18-max-debug på min burk. Men den skall klara subquerys alltså?

Förmodligen skall koden köras på Loopia.se till slut men de lär väl ha en uppdaterad MySQL.

Medlem sedan dec. 200012 464 inlägg
#7
SELECT artikel.id, case count(bild.artikelId) 
when 0 then 'Ingen bild' else 'Det finns bilder' end
FROM artikel
LEFT JOIN bild ON bild.artikelId = artikel.id
group by artikel.id
ORDER BY id DESC

Flyttas från ASP

Medlem sedan mars 2001148 inlägg
#8

Förståss!
Tack tack.
Group by fixade ju allt.

Medlem sedan nov. 20017 144 inlägg
#9

Group by måste du ha med när du mixar in count i frågan på det viset, ja.

266 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
139 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)