webForumDet fria alternativet

Relationsproblem i mysql

5 svar · 240 visningar · startad av nicke78

nicke78Medlem sedan okt. 200221 inlägg
#1

Jag har två tabeller i mysql. I den ena ligger det objekt med information som ska presenteras och i den andra ligger information om bilden. Varje objekt kan ha flera bilder knytna till sig via ett table som heter bilder. Nu skulle jag dock endast vilja läsa ut en första bilden på varje objekt och presentera sex stycken åt gången. Det ser ut som nedan, ursäkta formateringen..

<table = objekt>
id
info
pris
</table>

<table = bilder>
id
oid => det objektet som bilden hör till
bild => filnamn
</table>

SELECT objekt.id as id, bild FROM bilder LEFT JOIN objekt ON objekt.id=bilder.oid

Det ger en lång lista på 57 rader och 33 objekt. Hur ska jag formulera om frågan så jag får ut de första sex objektens bild. Antar att jag ska kombinera detta tillsammans med limit. Jag använder PHP som programmerings språk, men jag tror att lösningen på problemet ligger i sql koden...

Tack på förhand
//Niklas

LarsGMedlem sedan dec. 200012 464 inlägg
#2

Hur definierar du vad som är första bilden?

nicke78Medlem sedan okt. 200221 inlägg
#3

Det baseras på primärnyckeln som är id. Oid är en sekundärnyckel som länkar samman bilden med objektets primärnyckel.

Så första bilden är helt enkelt den bilden med lägst id, den som kommer först ur databasen då objekt.id=bilder.oid

//Niklas

LarsGMedlem sedan dec. 200012 464 inlägg
#4
select o.id, o.info, o.pris, b.bild
from object o join bilder b on o.id = b.oid
 where b.id in 
    (select min(id)
        from bilder
       where b.oid = bilder.oid)
nicke78Medlem sedan okt. 200221 inlägg
#5

Det funkar inte, får följande fel meddelande.

[Localhost] ERROR 1064: You have an error in your SQL syntax near 'on o.id = b.oid
where b.id in
(select min(id)
from bilder
w' at line 2

LarsGMedlem sedan dec. 200012 464 inlägg
#6

Vilken version av Mysql har du? Jag förutsätter 4.1 eller senare.

Det går att skriva om frågan utan subselect, något mer svårbegriplig dock

select o.id, o.info, o.pris, b1.bild,b1.id as bildid
from object o inner join bilder b1 on o.id = b.oid 
inner join bilder b2 on b1.oid = b2.oid
group by o.id, o.info, o.pris, b1.bild,b1.id
having b1.id = min(b2.id)
131 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
128 ms — hämta tråd, inlägg och bilagor (db)