[MySQL] Selecteren eigenschappen

Pagina: 1
Acties:

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 05:49
Hoi,

De titel van dit bericht is er vaag, omdat ik niet de juiste woorden ervoor kon verzinnen. Daarom met een kleine illustratie wat ik wil bereiken.

Ik beschrijf een conversie van eenheden, bijvoorbeeld graden fahrenheit -> graden celsius
Ik kan ook conversies bedenken van many-to-many, bijv: x,y,z -> a,b,c.

Ik sla de conversie functie op in een tabel:

Tabel: conversions
Velden: id, function

Er zijn verder 2 tabellen waarin ik eenheden koppel aan conversies: conversions_from, conversions_to

Tabel: conversions_from, conversions_to
Velden: conversionID, unitID

Hiermee kan ik dus meerdere eenheden koppelen aan een conversie functie.

Nu wil ik met 1 query uitzoeken of er al een functie bestaat die de conversie beschrijft van eenheden x,y naar eenheden a,b.

De volgende query doet dit:
SQL:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT c.function FROM
conversions_to t1, 
conversions_to t2,
conversions_from f1,
conversions_from f2,
conversions c
WHERE
t1.unitID = 'a' AND
t2.unitID = 'b' AND
f1.unitID = 'x' AND
f2.unitID = 'y' AND
t1.conversionID = t2.conversionID AND
f1.conversionID = t1.conversionID AND
f2.conversionID = f1.conversionID AND
c.id = t1.conversionID


Zoals je wel ziet schaalt dit niet erg goed (many-to-many) en is het lastig om deze query programatisch op te bouwen. Ik vroeg me af of hier standaard constructies voor zijn, of dat ik mijn tabel anders moet inrichten.

Alvast bedankt!

Ik blijf er iig vrij nuchter onder....


  • Pete
  • Registratie: November 2005
  • Laatst online: 31-10 12:38
Wat bedoel je precies met conversies?

Wil je gaan opslaan dat 10º Celcius = 50º Farenheit en 20º Celcius = 68º Farenheit of wil je de bereken methode opslaan.

Met graden is dit te doen:
Celcius -> Farenheit Gewoon een generieke functie f(x) = c.x (dus in dit geval een constante maal het aantal graden, dus je hoeft alleen die constante op te slaan)

Maar als jij drie variabelen wil converteren, hoe wil je dat doen dan? Is x,y,z -> a,b,c hetzelfde als (x->a, y->b, z->c)? (dus ook gewoon constantenfuncties)? Of is dat een ingewikkelde formule? Dan moet je nl. een formule gaan opslaan in je database.

Dus, kun je hetgeen je wilt converteren (en wat je wilt opslaan) ff iets beter uitleggen?

[ Voor 7% gewijzigd door Pete op 22-01-2007 12:05 ]

petersmit.eu


  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 05:49
Eh ja, misschien niet duidelijk genoeg, want het gaat hier om een SQL tabel probleem en niet om hoe die conversie functie precies werkt.

De vraag is dus hoe ik op meerdere entries in de conversions_from en conversions_to kan selecteren en daar de conversions.id en conversions.function bij kan vinden waarvoor alle entries in conversions_from en conversions_to aanwezig zijn met die conversions_from.conversionID en conversions_to.conversionID.

Het veld conversions.function is een string met daarin een javascriptje (maar daar gaat de vraag niet over)

Ik blijf er iig vrij nuchter onder....


  • Pete
  • Registratie: November 2005
  • Laatst online: 31-10 12:38
Het ziet er nog niet erg duidelijk uit. Zou je misschien een datavoorbeeldje van je tabellen kunnen laten zien? En dan van het resultaat van de query die je nu hebt?

petersmit.eu


  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 01-12 20:47
SQL:
1
2
3
4
5
6
7
SELECT function
FROM conversions
WHERE 1=1
AND id IN (SELECT conversionID FROM conversions_to WHERE unitID = 'A')
AND id IN (SELECT conversionID FROM conversions_to WHERE unitID = 'B')
AND id IN (SELECT conversionID FROM conversions_from WHERE unitID = 'X')
AND id IN (SELECT conversionID FROM conversions_from WHERE unitID = 'Y')

Dit zou hetzelfde resultaat moeten geven als jouw query, en is makkelijker te genereren.

Verwijderd

_js_ schreef op maandag 22 januari 2007 @ 14:00:
SQL:
1
2
3
4
5
6
7
SELECT function
FROM conversions
WHERE 1=1
AND id IN (SELECT conversionID FROM conversions_to WHERE unitID = 'A')
AND id IN (SELECT conversionID FROM conversions_to WHERE unitID = 'B')
AND id IN (SELECT conversionID FROM conversions_from WHERE unitID = 'X')
AND id IN (SELECT conversionID FROM conversions_from WHERE unitID = 'Y')

Dit zou hetzelfde resultaat moeten geven als jouw query, en is makkelijker te genereren.
Of veel makkelijker
SQL:
1
2
3
4
SELECT function
FROM conversions_to, conversions_from, conversions
WHERE conversions_to.unitID IN ('a', 'b') AND
conversions_from.unitID IN ('x', 'y')

(En dan nog koppelen met conversions)

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
phsmit schreef op maandag 22 januari 2007 @ 12:04:
Met graden is dit te doen:
Celcius -> Farenheit Gewoon een generieke functie f(x) = c.x (dus in dit geval een constante maal het aantal graden, dus je hoeft alleen die constante op te slaan)
0 graden C is niet 0 graden F, dus met alleen een schaling kom je er niet. :)

  • tyrion70
  • Registratie: December 2006
  • Laatst online: 14-05-2021
Wat dacht je van een andere tabel aanmaken?

Conversions_data met velden:
Conversion_id en Units

Waar units een comma seperated list is (liefst alphabetisch gerangschikt)? Dan kun je simpel weg :

select * from conversion_data where units = "a,b,x,y";

doen..

HTH

Doe maar gek! Anderen doen al gewoon genoeg :P


  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 05:49
Bedankt mensen.

P.S. ik gebruik natuurlijk geen database om vervolgens komma-gescheiden data erin te gaan opslaan...

Ik blijf er iig vrij nuchter onder....

Pagina: 1