Toon posts:

[MySql] Query deels uit database halen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Hallo,

Ik heb een query, waarin een "prijsregel" toegepast moet worden, dit is per record verschillend, en is als een SQL statement in de database opgeslagen.
Nu krijg ik deze prijsregel terug als string, maar ik wil dat hij deze als sql ziet en dus ook direct aan de sql kant "uitvoert" (bijv veld prijs * 10) en dat ik daarvan dus het resultaat krijg ipv de querystring.
Hoe kan ik dit t best aanpakken?

  • ZroBioNe
  • Registratie: Augustus 2001
  • Niet online
In welke taal?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:03

Creepy

Tactical Espionage Splatterer

Wat is die prijsregel precies? Als dat bijv. een percentage is dan zou het beter zijn om dit als getal in je DB te doen zodat je de berekening direct in je query kunt doen.
Hij wil het direct in SQL kunnen doen. Dus welke taal had je zelf in gedachten? :P

[ Voor 38% gewijzigd door Creepy op 08-05-2006 11:59 ]

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
SQL, wil het aan de sql kant doen (Stored Procedure) en het gaat om 180.000 rijen en dit moet binnen 2 tiende van een seconde te doen zijn, het gaat er dus puur om om een veld te selecteren in dit ook weer in de query te gebruiken

  • ZroBioNe
  • Registratie: Augustus 2001
  • Niet online
ah ok, ik dacht misschien wil je het met asp of php ophalen en dan weer uitvoeren..
In een stored procedure van MSSQL kan je iig EXEC gebruiken.
Staat er niets over in de MySQL documentatie??

Verwijderd

Topicstarter
@ Creepy, in die prijsregel staat een veldnaam + een wiskundige berekening (kan dus van alles zijn, maar sql kan dit wel uitvoeren). Dit staat in 1 veld. Hij moet dus de waarde uit een veld gebruiken, en daarop een berekening doen. En welk veld dat is is dus per record afhankelijk

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 00:22

Janoz

Moderator Devschuur®

!litemod

In sql is niet een eval achtige methode voor zover ik weet. Het lijkt me daarom ook niet mogelijk. Is er niet een andere manier om die prijsregels op te slaan? Wat voor regels zijn het? Als het alleen een vermenigvuldiging is dan zou je bijvoorbeeld de 10 op kunnen slaan.

edit: Dus de kolom waarop de bewerking uitgevoerd moet worden is telkens verschillend.

Is er niet een andere oplossing te verzinnen voor het opslaan van de data? Hoe ziet je model er nu uit? Het klinkt namelijk niet helemaal in orde.

[ Voor 31% gewijzigd door Janoz op 08-05-2006 12:02 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Ja met EXEC & CONCAT's ben ik inmiddels mee aan het experimenteren maar dit wil nog niet echt vlotten

Verwijderd

Topicstarter
@ Janoz, zoals ik zei, het is dus ook niet altijd hetzelfde veld waarop de berekening gedaan word

Verwijderd

Topicstarter
Mijn huidige query:
code:
1
2
3
4
5
6
7
8
SELECT `band`.`code` , `band`.`Merk` , `band`.`Maatcode` , `band`.`Type` , `band`.`Si` , `band`.`Li` , `band`.`E-keur` , `band`.`EAN code`,`prijs`.`VKprijs`,`prijs`.`KBprijs`,CONCAT(`prijsregel`.`Prijsafwijking`) AS prijs
FROM `garagist`
INNER JOIN `afnemersgroep` ON ( `garagist`.`GroepId` = `afnemersgroep`.`Id` )
INNER JOIN `grossier` ON ( `afnemersgroep`.`GrossierId` = `grossier`.`Id` )
INNER JOIN `prijs` ON ( `grossier`.`Prijsgroep Id` = `prijs`.`Prijsgroep Id` )
INNER JOIN `band` ON ( `prijs`.`code` = `band`.`code` )
LEFT OUTER JOIN `prijsregel` ON ( `garagist`.`GroepId` = `prijsregel`.`Groep Id`
AND `band`.`code` = `prijsregel`.`code` )


een voorbeeld van zon prijsafwijking/prijsregel zoals hij opgeslagen is:
`prijs`.`KBprijs` - (30)
We hebben dus garagisten, deze zijn ingedeeld in groepen, en een groep is weer van een grossier. Nu kan een grossier per garagist per band een prijsafwijking/prijsregel instellen. En dit moet dus toegepast worden bij het opvragen van de prijzen door de garagist. De prijzen wijzigen enkele keren per dag...
De prijs is dus per band per grossier per groep verschillend pm t ff simpel te houden :+

[ Voor 21% gewijzigd door Verwijderd op 08-05-2006 12:09 ]


  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 00:22

Janoz

Moderator Devschuur®

!litemod

Ik bedoelde niet perce die ene query, maar je database structuur. Een echte eval methode zit niet standaard in sql. Al zouden sommige rdbms het wel hebben, snel zal het nooit worden. Dat zal dus niet zomaar lukken. Het lijkt me echter dat het niet geheel onmogelijk is om dit zonder een eval achtig iets op te lossen.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Verwijderd

Topicstarter
Hmmm, ik ben totaal niet bekend met 'eval'. dus dat je daar mee bedoelt snap ik niet, maar zal dr eens op googlen

  • Atari Paul
  • Registratie: November 2002
  • Laatst online: 20:55
Je zou zelf een soort van parser kunnen maken in SQL, maar dat zal niet gaan performen...
Bijvoorbeeld met het volgende in de database:
prijsberekening = 'totaal-10'
totaal = 100
Resultaat na onderstaande (ongeteste) query: 90

SQL:
1
SELECT if(locate('-',prijsberekening),totaal-substring(prijsberekening,locate('-',prijsberekening)+1),'ERROR') FROM table WHERE id='1'


Disclaimer, dit heb ik niet getest.

[ Voor 74% gewijzigd door Atari Paul op 08-05-2006 13:10 ]

Stability ?? My Atari still has it :)


  • [ash]
  • Registratie: Februari 2002
  • Laatst online: 05-04-2025

[ash]

Cookies :9


Verwijderd

Topicstarter
Niet echt....

@Atari Paul, ik heb dus pure sql in mijn db, en wil dus, met t oog op de performance, daar niet weer een parser voor maken. Maar ik ga dr wel ff mee aan t proberen

Verwijderd

Topicstarter
Met de "workaround" van Atari Paul wil t ook niet echt lukken, iemand nog suggesties?

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:03

Creepy

Tactical Espionage Splatterer

Twee losse queries uitvoeren. 1 waarin je de SQL uit de DB vist. Vervolgens stel je in je code de tweede query samen en voer je deze uit. Ranzig, slecht voor je performance (want elke keer twee queries) maar werkt wel eenvoudig :)

Maar beter zou zijn om een vaste berekening te gebruiken zodat je met een eenvoudige berekening in SQL dit kan oplossen en dus geen SQL in je DB hoeft op te slaan (want dat is nu niet de beste oplossing zoals je nu al merkt ;) ).

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Verwijderd

Topicstarter
Ja maar de gebruiker kan dus die berekening aanpassen, en die moet dus wel ergens opgeslagen worden...
Ik kan de berekening ook wel aan de PHP zijde uitvoeren nu, maar dan krijg ik een probleem met met het sorteren op prijs ;)

[ Voor 38% gewijzigd door Verwijderd op 08-05-2006 14:39 ]

Pagina: 1