webForumDet fria alternativet
Logga in / Bli medlem

Relationsproblem i mysql

Databaser & SQL

5 svar · 242 visningar · startad av nicke78

Medlem sedan okt. 200221 inlägg
Trådstart#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

Medlem sedan dec. 200012 464 inlägg
#2

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

Medlem 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

Medlem 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)
Medlem 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

Medlem 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)
252 ms totalt · 4 externa anrop · v20260731065814-full.51f67c91
125 ms — deklarationer (db)
0 ms — hämta statistik (cache)
125 ms — hämta tråd, inlägg och bilagor (db)
125 ms — ändringar (db)