webForumDet fria alternativet

Söka på "attribute"

Databaser & SQL

4 svar · 507 visningar · startad av henrikjohansson

Medlem sedan maj 2000360 inlägg
Frågan#1

Hej, behöver nog en knuff i rätt riktning..

Låt säga att jag har 2 tabeller,
Objects med kolumner: ID, Namn
Attributes med kolumner: ObjectId, AttributeName, AttributeValue

Som ni kanske kan gissa så kan varje object ha flera attributes, upp mot 40 stycken (kanske ännu fler i ett senare skede)

Nu vill jag lista alla Objects som som har
AttributeName = 'Name' and AttributeValue = 'Börje'
och
AttributeName = 'Age' and AttributeValue > 15
och
AttributeName = 'Age' and AttributeValue < 55

Även villkoren kommer att öka, så man får 15-20 vilkor.

Enda sättet jag kan komma på nu är att man har flera joins mot Attributes tabellen, men vet inte om det är "rätt" väg att gå.
Har någon några tips?

Medlem sedan dec. 200012 464 inlägg
#2
select namn
  from object
 where id in
  (select objectId
      from attributes
     where (AttributeName = 'Name' 
        and AttributeValue = 'Börje')
         or (AttributeName = 'Age' 
        and cast(AttributeValue as int) between 16 and 54)
  group by objectId
 having count(*) = 2)

Om du har flera villkor på samma attributnamn så ser jag inget alternativ till att slå ihop dessa.

Då attributevalue är definerad som text så behöver du göra en typkovertering innan jämförelsen.

Medlem sedan maj 2000360 inlägg
#3

Tack för ditt svar, det ser ut som en smidig lösning.

Dock så kommer den väl att visa Objects som har Name=Börje eller Age between 16 and 54.

Hur blir det om man bara vill ha ut där de både har namnet börje och en korrekt ålder?

Kommer nog att lägga till en eller två extra kollumner AttributeIntValue, AttributeFloatValue eller liknande för att slippa en del castning.

Medlem sedan dec. 200012 464 inlägg
#4

Group by och having gör att du bara får de poster där både attributen finns. Jag förutsätter att varje attribut bara förekommer en gång för varje objekt.

Medlem sedan maj 2000360 inlägg
#5

ah, självklart
Tack

586 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
152 ms — deklarationer (db)
127 ms — hämta statistik (db)
304 ms — hämta tråd, inlägg och bilagor (db)
151 ms — ändringar (db)