Jij wilt zeggen dat een postgres of mysql or oracle 1,99 als 1,98999 of als 1,97 teruggeeft? Ik geloof daar geen drol van.quote:Op vrijdag 29 november 2013 22:33 schreef Light het volgende:
[..]
Een database kan prima floats en doubles opslaan, maar de exacte waarde die je opslaat is niet de waarde die je terugkrijgt. Floats en doubles kunnen namelijk niet ieder getal exact weergeven. 1,99 wordt dan misschien 1,9899999999. En dat gaat vroeg of laat afrondingsproblemen geven die ook nog eens best lastig te vinden zijn. Bij financiele informatie is dat niet wenselijk, dus kun je beter met centen rekenen en pas bij weergave afronden.
Light overdrijft een beetje, maar heeft wel een puntje.quote:Op vrijdag 29 november 2013 22:35 schreef slacker_nl het volgende:
[..]
Jij wilt zeggen dat een postgres of mysql or oracle 1,99 als 1,98999 of als 1,97 teruggeeft? Ik geloof daar geen drol van.
Zie bijvoorbeeld ook hier:quote:Op vrijdag 29 november 2013 22:35 schreef slacker_nl het volgende:
[..]
Jij wilt zeggen dat een postgres of mysql or oracle 1,99 als 1,98999 of als 1,97 teruggeeft? Ik geloof daar geen drol van.
Het is gewoon opletten met wat je doet, bijv round(1.4545,2) geeft 1.45 terug.quote:Op vrijdag 29 november 2013 22:35 schreef slacker_nl het volgende:
[..]
Jij wilt zeggen dat een postgres of mysql or oracle 1,99 als 1,98999 of als 1,97 teruggeeft? Ik geloof daar geen drol van.
Het probleem is niet round(), het probleem is die 1.4545 en de nauwkeurigheid daarvan. Als je alleen dat getal hebt, zal het wel goed gaan. Als je spannende berekeningen doet en verschillende getallen gebruikt, kun je een afwijking krijgen.quote:Op vrijdag 29 november 2013 22:43 schreef TwenteFC het volgende:
[..]
Het is gewoon opletten met wat je doet, bijv round(1.4545,2) geeft 1.45 terug.
Vreemd, hier wel. Wat is de return value van setlocale? Zie de docs even, daar staan wat nuttige dingen in..quote:Op vrijdag 29 november 2013 21:48 schreef xaban06 het volgende:
[..]
setlocale lijkt geen verandering er in te brengen.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | CREATE TABLE `group` ( `id` TINYINT NULL AUTO_INCREMENT DEFAULT NULL, `name` TINYINT NULL DEFAULT NULL, PRIMARY KEY (`id`) ); CREATE TABLE `location` ( `id` TINYINT NULL AUTO_INCREMENT DEFAULT NULL, `group_id` TINYINT NULL DEFAULT NULL, PRIMARY KEY (`id`) ); CREATE TABLE `room` ( `id` TINYINT NULL AUTO_INCREMENT DEFAULT NULL, `location_id` TINYINT NULL DEFAULT NULL, PRIMARY KEY (`id`) ); CREATE TABLE `opening_hours` ( `id` TINYINT NULL AUTO_INCREMENT DEFAULT NULL, `open_time` TIME NULL DEFAULT NULL, `close_time` TIME NULL DEFAULT NULL, `weekday` TINYINT NULL DEFAULT NULL, PRIMARY KEY (`id`) ); |
Opzich ook een mooie oplossing inderdaad, alleen heb ik hier een ander probleem, namelijk dat de openingstijden per dag verschillend kunnen zijn (het weekday veld in opening_hours) Dat betekent dat ieder eigenlijk 7 "openingstijden" heeft. Om nou aan elke tabel zeven velden toe te voegen lijkt me ook niet erg mooi.quote:Op zondag 1 december 2013 13:41 schreef papernote het volgende:
Derde optie: een opening_hours_id toevoegen aan group, location en room welke ook NULL kan zijn.
Dan kun je beter aan de tabel opening_hours een kolom location_id (of room_id) toevoegen, om aan te geven voor welke locatie die openingstijden gelden. Dan weet je ook zeker dat je voor iedere lokatie de tijden apart kunt aanpassen zonder dat je tijden van andere lokaties verandert.quote:Op zondag 1 december 2013 13:53 schreef Alfje het volgende:
[..]
Opzich ook een mooie oplossing inderdaad, alleen heb ik hier een ander probleem, namelijk dat de openingstijden per dag verschillend kunnen zijn (het weekday veld in opening_hours) Dat betekent dat ieder eigenlijk 7 "openingstijden" heeft. Om nou aan elke tabel zeven velden toe te voegen lijkt me ook niet erg mooi.
Als je het echt wilt normaliseren ontkomt je daar niet aan, anders gaat het botsen met je business rules. Wat je nog wel zou kunnen doen is een table "opening schema's" maken waarin je dus verschillende sets van openingstijden kunt definieren, eventueel zou je dat ook weer naar 2 tables kunnen normaliseren met weer een opsplitsing per dag.quote:Op zondag 1 december 2013 13:53 schreef Alfje het volgende:
[..]
Opzich ook een mooie oplossing inderdaad, alleen heb ik hier een ander probleem, namelijk dat de openingstijden per dag verschillend kunnen zijn (het weekday veld in opening_hours) Dat betekent dat ieder eigenlijk 7 "openingstijden" heeft. Om nou aan elke tabel zeven velden toe te voegen lijkt me ook niet erg mooi.
1 | PHP Fatal error: Cannot use object of type mysqli_result as array in file.php |
1 2 3 4 5 6 7 8 9 10 11 12 13 | <?php $productQuery = "SELECT ean, name FROM products WHERE category = '$category'"; $productResult = $mysqli->query($productQuery); while ($productRow = $productResult->fetch_assoc()) { $productPriceQuery = "SELECT ean, price+shipmentCost AS totalPrice FROM prices WHERE ean = $productRow[ean] ORDER BY totalPrice ASC"; $productPriceResult = $mysqli->query($productPriceQuery); $totalPrice = $productPriceResult->fetch_assoc(); echo $productPriceResult["productURL"]; } ?> |
quote:Return Values
Returns FALSE on failure. For successful SELECT, SHOW, DESCRIBE or EXPLAIN queries mysqli_query() will return a mysqli_result object. For other successful queries mysqli_query() will return TRUE.
Ik weet dat het efficienter kan dmv een 1 langere query, maar voor nu wil ik het doen zoals ik het heb, moet ook gewoon kunnen toch?quote:Op donderdag 5 december 2013 16:00 schreef zoem het volgende:
Beste oplossing (vziw ik uit de context kan halen): gebruik een JOIN.
Oplossing voor jouw snippet: sla de documentatie erop na
[..]
Natuurlijk, dat gaat ook werken. Alleen kan het aantal queries dan gigantisch oplopen als je een hele reeks aan producten hebt, waardoor de pagina traag wordt en/of de server het (onnodig) druk kan krijgen bij veel bezoekers.quote:Op donderdag 5 december 2013 16:05 schreef xaban06 het volgende:
[..]
Ik weet dat het efficienter kan dmv een 1 langere query, maar voor nu wil ik het doen zoals ik het heb, moet ook gewoon kunnen toch?
Klopt, maar dat is het geval nietquote:Op donderdag 5 december 2013 16:08 schreef zoem het volgende:
[..]
Natuurlijk, dat gaat ook werken. Alleen kan het aantal queries dan gigantisch oplopen als je een hele reeks aan producten hebt, waardoor de pagina traag wordt en/of de server het (onnodig) druk kan krijgen bij veel bezoekers.
En daarbij nog de overhead welke wordt veroorzaakt door het verkeer tussen het script en de MySQL server... Ik zou zelf niet zo snel query's in een loop gaan zetten als dat niet nodig is.quote:Op donderdag 5 december 2013 16:08 schreef zoem het volgende:
[..]
Natuurlijk, dat gaat ook werken. Alleen kan het aantal queries dan gigantisch oplopen als je een hele reeks aan producten hebt, waardoor de pagina traag wordt en/of de server het (onnodig) druk kan krijgen bij veel bezoekers.
quote:Op donderdag 5 december 2013 16:09 schreef xaban06 het volgende:
[..]
Klopt, maar dat is het geval nietEn ik wil het liever nu werkend hebben dan dat ik me weer moet inlezen, proberen, repareren, proberen, etc etc. Kost erg veel tijd voor nu
Wat is er precies fout in mijn script?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?php $productQuery = "SELECT ean, name FROM products WHERE category = '$category'"; $productResult = $mysqli->query($productQuery); while ($productRow = $productResult->fetch_assoc()) { $productPriceQuery = "SELECT ean, price+shipmentCost AS totalPrice FROM prices WHERE ean = $productRow[ean] ORDER BY totalPrice ASC"; $productPriceResult = $mysqli->query($productPriceQuery); $totalPrice = $productPriceResult->fetch_assoc(); echo $productPriceResult["productURL"]; // productPriceResult is dus een mysqli object, geen array echo $totalPrice["productURL"]; // totalPrice moet je hebben, want die had je al omgezet naar een assoc array } ?> |
Je kunt je query simpelweg aanpassen naar:quote:Op donderdag 5 december 2013 16:09 schreef xaban06 het volgende:
[..]
Klopt, maar dat is het geval nietEn ik wil het liever nu werkend hebben dan dat ik me weer moet inlezen, proberen, repareren, proberen, etc etc. Kost erg veel tijd voor nu
Wat is er precies fout in mijn script?
1 2 3 4 | $productQuery = "SELECT products.ean, products.name, prices.price+prices.shipmentCost AS totalPrice, products.productURL FROM products JOIN prices ON products.ean = prices.ean WHERE category = '$category'"; |
Hartstikke bedankt voor de query, wordt gewaardeerd, maar mijn query wordt straks nog langer en dan weet ik dat ik er niet meer uit zal komen, vandaar hield ik het simpelquote:Op donderdag 5 december 2013 16:15 schreef bondage het volgende:
[..]
Je kunt je query simpelweg aanpassen naar:
[ code verwijderd ]
De laatste regel in de loop is de verbetering, de voorlaatste regel is foutief.quote:Op donderdag 5 december 2013 16:15 schreef xaban06 het volgende:
[..]
Ik zie geen verschil tussen jouw en mijn code, of wel?
De vraag is of er meerdere prijzen zijn per artikel, want dan moet de code iets aangepast worden. Anders was dit een prima drop-in replacement geweestquote:Op donderdag 5 december 2013 16:15 schreef bondage het volgende:
[..]
Je kunt je query simpelweg aanpassen naar:
[ code verwijderd ]
Per product zijn er meerdere prijzen, ik haal de goedkoopste eruit per product.quote:Op donderdag 5 december 2013 16:17 schreef zoem het volgende:
[..]
De laatste regel in de loop is de verbetering, de voorlaatste regel is foutief.
[..]
De vraag is of er meerdere prijzen zijn per artikel, want dan moet de php code iets aangepast worden.
Deze query zou die data moeten teruggeven. Kan echter niet testen en weet niet zeker of het zo klopt... Misschien dat zoem hier eventueel een aanvulling op kan geven.quote:Op donderdag 5 december 2013 16:18 schreef xaban06 het volgende:
[..]
Per product zijn er meerdere prijzen, ik haal de goedkoopste eruit per product.
1 2 3 4 5 6 7 8 | SELECT * FROM ( SELECT products.ean, products.name, prices.price+prices.shipmentCost AS totalPrice, products.productURL FROM products JOIN prices ON products.ean = prices.ean WHERE category = '$category' ) AS t GROUP BY t.ean HAVING t.totalPrice = MIN(t.totalPrice) |
Dit is inderdaad de juiste manier, en juist op deze manier hou je je queries ook redelijk leesbaar vind ik.quote:Op donderdag 5 december 2013 16:30 schreef bondage het volgende:
[..]
Deze query zou die data moeten teruggeven. Kan echter niet testen en weet niet zeker of het zo klopt... Misschien dat zoem hier eventueel een aanvulling op kan geven.
[ code verwijderd ]
Thanks voor deze reactie.quote:Op donderdag 5 december 2013 16:32 schreef zoem het volgende:
Dat is het bekende groupwise maximum (of minimum) probleem. Via de bekende zoekmachine zijn daar tal voorbeelden en oplossingen over te vinden.
1 2 3 | SELECT products.ean, prices.ean, prices.price FROM products, prices WHERE prices.price=(SELECT MIN(prices.price) FROM prices WHERE products.ean = prices.ean); |
prices.price+prices.shipmentCost AS totalPrice in de select werkt niet? Als het niet werkt zou je je query in een andere query kunnen zetten en dan in de buitenste query de waarden optellen.quote:Op donderdag 5 december 2013 23:51 schreef xaban06 het volgende:
[..]
Thanks voor deze reactie.
Volgens mij moet dit werken:
[ code verwijderd ]
/edit
het lijkt te werken, echter wil ik price+shipmentCost bijelkaar optellen, dan veranderd de WHERE, maar snap m niet helemaal
1 2 3 | # De syntax zal wellicht iets anders zijn, maar gebruik het! $stm = $PDO_object->prepare("SELECT * FROM meuk WHERE iets = ?"); $stm->execute($bla); |
Als je toch PDO gaat gebruiken, gebruikt dan BindParams. Dan je meteen typecasten en andere restricties op je input zetten.quote:Op vrijdag 6 december 2013 10:06 schreef slacker_nl het volgende:
Kennen jullie PDO? Ga het gebruiken!! Die sql die "SELECT * FROM meuk where iets = $bla"; is jakkes. Maak een prepared statement en execute die:
[ code verwijderd ]
Hoe heet je tabel en kolomnamen?quote:Op zondag 8 december 2013 18:28 schreef Onnoman het volgende:
Rij1: |1| |2| |3|
Rij2: |1| |2| |3|
Rij3: |1| |3| |4|
Rij4: |1| |5| |6|
Met bovenstaande tabel wil ik graag het resultaat van de bovenste 2 rijen terug krijgen omdat rij 2 de waarde 2 heeft en rij 3 de waarde 3.
welke query moet ik hiervoor uitvoeren?
alvast bedankt
Wat heb je al geprobeerd?quote:Op zondag 8 december 2013 18:28 schreef Onnoman het volgende:
Rij1: |1| |2| |3|
Rij2: |1| |2| |3|
Rij3: |1| |3| |4|
Rij4: |1| |5| |6|
Met bovenstaande tabel wil ik graag het resultaat van de bovenste 2 rijen terug krijgen omdat rij 2 de waarde 2 heeft en rij 3 de waarde 3.
welke query moet ik hiervoor uitvoeren?
alvast bedankt
Leg eens uit waarom je dit doet. Wat is het echt probleem. Je echte kolomnamen. Dit is namelijk niet erg duidelijk.quote:Op zondag 8 december 2013 18:56 schreef Onnoman het volgende:
ik wil eigenlijk een count doen op het aantal rijen met de zelfde kolom waardes
dus hoeveel rijen uit mijn tabel heeft een overeenkomstige waarde in kolom 2 en 3
ik dacht iets van
Select kolom2, kolom3, count(*) from table
group by kolom2, kolom3
having count(*) > 3;
maar dit gaat niet helemaal goed
is ook niet relevant.. het gaat mij puur om een voorbeeld query volgens mijn omschrijvingquote:Op zondag 8 december 2013 18:59 schreef totalvamp het volgende:
[..]
Leg eens uit waarom je dit doet. Wat is het echt probleem. Je echte kolomnamen. Dit is namelijk niet erg duidelijk.
Misschien is je tabel opzet wel verkeerd en ben je op de verkeerde wijze bezig.quote:Op zondag 8 december 2013 19:00 schreef Onnoman het volgende:
[..]
is ook niet relevant.. het gaat mij puur om een voorbeeld query volgens mijn omschrijving
ik wil namelijk de relatie met andere tabellen achterhalen
nou ik heb een kolom met de naam: straatnaam, huisnummer, en kamernummerquote:Op zondag 8 december 2013 19:02 schreef totalvamp het volgende:
[..]
Misschien is je tabel opzet wel verkeerd en ben je op de verkeerde wijze bezig.
Daarom is het relevant zodat ik een algemeen idee kan krijgen wat je wilt met je query
Geen manier om het te testen maar zoiets zou kunnen werken.quote:Op zondag 8 december 2013 19:10 schreef Onnoman het volgende:
[..]
nou ik heb een kolom met de naam: straatnaam, huisnummer, en kamernummer
ik wil een count doen op alle rijen die dezelfde straatnaam en huisnummer hebben
Dat is mooi!quote:Op zondag 8 december 2013 19:20 schreef Onnoman het volgende:
heb het trouwens al gevonden
mijn eerste query was toch goed
Ook goed!quote:Op vrijdag 6 december 2013 11:00 schreef Boze_Appel het volgende:
[..]
Als je toch PDO gaat gebruiken, gebruikt dan BindParams. Dan je meteen typecasten en andere restricties op je input zetten.
Standaardgedrag van exit() en (die(), want dat is een alias voor exit() ) als de parameter een string is. Als je een integer als parameter geeft, wordt dat de exit code. Maar daar heb je niets aan bij webpagina's.quote:Op zondag 8 december 2013 19:00 schreef Robuustheid het volgende:
[..]
Waarom toont de exit-functie de parameter?
Edit, laat maar.quote:Op zondag 8 december 2013 19:00 schreef Onnoman het volgende:
[..]
is ook niet relevant.. het gaat mij puur om een voorbeeld query volgens mijn omschrijving
ik wil namelijk de relatie met andere tabellen achterhalen
Of stored procedures, zijn ook nog eens makkelijker te testen.quote:
http://www.mysql.com/products/workbench/quote:Op donderdag 12 december 2013 14:35 schreef Onnoman het volgende:
Kent iemand een tooltje waarmee je van een sql of xml bestand een database diagram kan genereren?
Dus met relatie lijntjes enzo?
alvast bedankt!
Forum Opties | |
---|---|
Forumhop: | |
Hop naar: |