"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."
En met IF en IS NULL kan het ook, maar dan moet je maar de IF syntax opnieuw lezen.
[ Voor 66% gewijzigd door Voutloos op 23-03-2008 14:08 ]
{signature}
[ Voor 3% gewijzigd door P_de_B op 23-03-2008 14:09 ]
Oops! Google Chrome could not find www.rijks%20museum.nl
1
| SELECT SUM(COALESCE(hits, 0)) AS hits, SUM(sessions) AS visits FROM ... |
Levert hetzelfde op als
1
| SELECT SUM(hits) AS hits, SUM(sessions) AS visits FROM ... |
...dacht toch echt dat ik het goed gelezen had...back to the drawingboard dan maarEn met IF en IS NULL kan het ook, maar dan moet je maar de IF syntax opnieuw lezen.![]()
Dat had ik dus eerst. Ik loopte door de resultset en vulde dan "0" is voor een resultrow met NULL. Maar het lijkt mij netter als de database server een complete resultset teruggeeft (hetzij dus wat bewerkt), waar ik in PHP meteen mee aan de slag kan...P_de_B schreef op zondag 23 maart 2008 @ 14:08:
Functies als ISNULL (en coalesce) werken niet, er is immers geen resultset om bewerkingen op door te voeren. Er zijn wel trucjes voor te bedenken, maar volgens mij moet je de presentatie van 'geen records gevonden' gewoon door de client laten afhandelen.
[ Voor 36% gewijzigd door Reveller op 23-03-2008 14:13 ]
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."
Anyone who gets in between me and my morning coffee should be insecure.
Neem je whisky mee, is het te weinig... *zucht*
Gewoon een constante tegen iets left joinen ed.P_de_B schreef op zondag 23 maart 2008 @ 14:08:
Er zijn wel trucjes voor te bedenken,
Dat is waar, maar in een aantal situaties is een trucje met een constante of cartesisch product icm functies als COALESCE wel kniftig.maar volgens mij moet je de presentatie van 'geen records gevonden' gewoon door de client laten afhandelen.
Maar in dit geval is een succesvol uitgevoerde query met een lege resultset prima te verwerken.
{signature}
Nouja...omdat het pasen is wijten we het maar aan de wijnmomania schreef op zondag 23 maart 2008 @ 14:12:
Je moet natuurlijk wel je COALESCE( ... , 0 ) om je SUM heen doen suffie
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."
Precies, dit kun je op veel verschillende manieren doen, maar mijn voorkeur gaat uit naar de client. De db geeft simpelweg de gevraagde records terug (of niets als er niets is gevonden) en daarmee klaar.Voutloos schreef op zondag 23 maart 2008 @ 14:13:
[...]
Gewoon een constante tegen iets left joinen ed.
Oops! Google Chrome could not find www.rijks%20museum.nl
{signature}
Als ik aantal hits wil weten uit een database denk ik aan een COUNT, die default gewoon 0 terug geeft.
Een SUM is voor andere doeleinden.
Neem je whisky mee, is het te weinig... *zucht*
{signature}
COALESCE (of isnull of welke andere functie dan ook) ben ik met je eens. Dat is simpelweg een functie die je op de gevonden resultset toepast. Ik ben minder voorstander van acties waarbij je 'kunstmatig' records gaat teruggeven als er geen records gevonden worden. Ik vind het vreemd en onjuist dat een database records gaat teruggeven, puur en alleen om aan de client makkelijker te kunnen weergeven dat er geen records gevonden zijn.Voutloos schreef op zondag 23 maart 2008 @ 14:23:
Aangezien het wel de (een) oplossing is, is de echte query blijkbaar een stuk uigebreider. Sowieso ken je de context niet, er zijn gewoon gevallen waarbij COALESCE het verwerken van de resultset vele malen eenvoudiger en eleganter maakt, dus die voorkeur van jou kan geen harde regel zijn.
Bijvoorbeeld de suggestie om te left-joinen met iets dat eigenlijk helemaal niet relevant is voor de query of de resultset kan ervoor zorgen dat het executieplan niet zo goed is als dat het zou kunnen zijn voor de gevraagde gegevens.
[ Voor 12% gewijzigd door P_de_B op 23-03-2008 14:29 ]
Oops! Google Chrome could not find www.rijks%20museum.nl
Het hoeft geen verkeerd datamodel te zijn. Bij mijn site houd ik per pagina bij hoevaak deze bezocht is in een 'hits' kolom. Om dan alle hits van mijn site te weten hoef ik die getallen alleen maar bij elkaar op te tellen, en daar is SUM() de aangewezen functie voor.momania schreef op zondag 23 maart 2008 @ 14:23:
Ik denk trouwens dat eerder hier een verkeerd datamodel is.
Als ik aantal hits wil weten uit een database denk ik aan een COUNT, die default gewoon 0 terug geeft.
Een SUM is voor andere doeleinden.
Sole survivor of the Chicxulub asteroid impact.
Verwijderd schreef op zondag 23 maart 2008 @ 14:38:
Waarom check je dit niet in de code? If (aaa == null) var = 0;
Reveller schreef op zondag 23 maart 2008 @ 14:11:
[...]
Dat had ik dus eerst. Ik loopte door de resultset en vulde dan "0" is voor een resultrow met NULL. Maar het lijkt mij netter als de database server een complete resultset teruggeeft (hetzij dus wat bewerkt), waar ik in PHP meteen mee aan de slag kan...
"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."
Nou ben ik niet superbekend met MySQL maar is het dan niet "aaa is null"?Verwijderd schreef op zondag 23 maart 2008 @ 14:38:
Waarom check je dit niet in de code? If (aaa == null) var = 0;
"...in de code..." Juist ja
[ Voor 8% gewijzigd door RobIII op 23-03-2008 15:38 ]
There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.
Je eigen tweaker.me redirect
Over mij
Verwijderd
Heb je de MySQL documentatie van die functies wel gelezen?Reveller schreef op zondag 23 maart 2008 @ 14:06:
Dit geeft allebei dikke foutmeldingen. Wie kan mij verder helpen?
Verwijderd schreef op zondag 23 maart 2008 @ 19:02:
Volgens mij is er niet zoveel mis met NULL als resultaat (duidelijk antwoord en zoals je zegt kan je het prima verwerken in code). De SQL truckjes van hierboven komen op mij minder netjes over (query is minder duidelijk). Ik zou het gewoon zo laten als het nu is.
1
| SELECT ifnull(SUM(hits), 0) AS hits, ifnull(SUM(sessions), 0) AS visits |
Dit is toch niet minder duidelijk?
[ Voor 19% gewijzigd door Olaf van der Spek op 24-03-2008 15:22 ]