webForumDet fria alternativet

Söka på "attribute"

4 svar · 507 visningar · startad av henrikjohansson

henrikjohanssonMedlem sedan maj 2000373 inlägg
#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?

LarsGMedlem sedan dec. 200012 465 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.

henrikjohanssonMedlem sedan maj 2000373 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.

LarsGMedlem sedan dec. 200012 465 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.

henrikjohanssonMedlem sedan maj 2000373 inlägg
#5

ah, självklart
Tack

Genererad på 375 ms · cache AV · v20260730165559-full.f96bc7eb