Toon posts:

[SQL] NULL uit join als 0 uitlezen laten tellen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Eerste keer dat ik iets in P&W post, tot nu toe kwam ik er altijd zelf uit. Ik zal eerst even uitleggen waar ik mee bezig ben. Het is een statssysteem voor DC-project D2OL in PHP+MYSQL.

Ik heb een tabel d2ol_userdagstats, waarin elke avond om 0:00 de stats van die dag worden opgeslagen, en een tabel d2ol_userhalfuurstats waarin elk half uur de stats van die dag worden opgeslagen.

Het gaat over de halfuurtabel, hierin sla ik op:

aantal
dagpositie
dagverschil (verschil met dagpositie van gisteren)
overallpositie
overallverschil (verschil met overallpositie van gisteren)

Deze informatie wordt alleen opgeslagen voor actieve gebruikers, maar voor overallpositie moet er wel vergeleken worden met de inactieve gebruikers.

Nu heb ik daarvoor dit SQL statement gemaakt:

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
select 
    sum(a.aantal)+b.aantal as combo_aantal, 
    a.userid 
from 
    d2ol_userdagstats as a 
left join 
    d2ol_userhalfuurstats as b 
on 
    a.userid=b.userid 
group by 
    a.userid 
order by 
    combo_aantal desc;


En dat geeft dit resultaat:
code:
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
26
27
28
29
30
31
32
33
34
+--------------+--------+
| combo_aantal | userid |
+--------------+--------+
|         NULL |     19 |
|         NULL |     20 |
|         NULL |      8 |
|         NULL |     21 |
|         NULL |     22 |
|         NULL |     10 |
|         NULL |     23 |
|         NULL |     11 |
|         NULL |     24 |
|         NULL |     12 |
|         NULL |     25 |
|         NULL |     13 |
|         NULL |     26 |
|         NULL |     27 |
|         NULL |     16 |
|         NULL |     17 |
|         NULL |     18 |
|        47709 |      2 |
|         9016 |      1 |
|         8372 |     14 |
|         7218 |     15 |
|         3646 |      9 |
|         1241 |      3 |
|          610 |      5 |
|          478 |      4 |
|          460 |     31 |
|          364 |     29 |
|          124 |      7 |
|          114 |     30 |
|           49 |      6 |
+--------------+--------+


Wat er dus aan de hand is, is dat als er geen halfuurstats gedefinieerd zijn, hij bij de optelling het resultaat NULL geeft. Om eea even te illusteren:

code:
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
26
27
28
29
30
31
32
33
34
+-----------+----------------+--------+
| db_aantal | vandaag_aantal | userid |
+-----------+----------------+--------+
|     47709 |              0 |      2 |
|     17861 |           NULL |     10 |
|      8991 |             25 |      1 |
|      8372 |              0 |     14 |
|      7218 |              0 |     15 |
|      6049 |           NULL |     13 |
|      3646 |              0 |      9 |
|      3615 |           NULL |     12 |
|      3381 |           NULL |     24 |
|      2646 |           NULL |     20 |
|      1614 |           NULL |     19 |
|      1216 |             25 |      3 |
|       975 |           NULL |     22 |
|       911 |           NULL |     17 |
|       698 |           NULL |     21 |
|       684 |           NULL |     18 |
|       610 |              0 |      5 |
|       518 |           NULL |     16 |
|       478 |              0 |      4 |
|       460 |              0 |     31 |
|       379 |           NULL |     25 |
|       370 |           NULL |      8 |
|       364 |              0 |     29 |
|       330 |           NULL |     27 |
|       226 |           NULL |     23 |
|       186 |           NULL |     26 |
|       172 |           NULL |     11 |
|       124 |              0 |      7 |
|       114 |              0 |     30 |
|        49 |              0 |      6 |
+-----------+----------------+--------+


De query hiervan was:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
select
    sum(a.aantal) as db_aantal,
    b.aantal as vandaag_aantal, 
    a.userid 
from 
    d2ol_userdagstats as a 
left join 
    d2ol_userhalfuurstats as b 
on 
    a.userid=b.userid 
group by 
    a.userid 
order by 
    db_aantal desc;


Mijn vraag is dus of het mogelijk is om die NULL uit de join als 0 te laten tellen zodat de optelling slaagt, en ik een overallpositie kan bepalen?

Ik heb (natuurlijk) gezocht op GoT (waar niet zo veel te vinden was) en op mysql.com en google, maar je vind zo ontzettend veel als je zoekt op 0 as NULL in JOIN +mysql terwijl het allemaal hier niet mee te maken heeft.

  • JaQ
  • Registratie: Juni 2001
  • Laatst online: 21-08 17:50

JaQ

je zoekt de mysql variant van de oracle functie nvl als ik het goed begrijp. Die heet volgens mij isnull(), maar zeker weten doe ik het niet. Zoek maar ff in de manual.

nullif() dus

[ Voor 22% gewijzigd door JaQ op 25-09-2003 18:16 ]

Egoist: A person of low taste, more interested in themselves than in me


Verwijderd

Topicstarter
Heel erg bedankt! Met ifnull() werkt het nu :)

Voor de searchers:

Mijn query is nu:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
select 
    sum(a.aantal)+IFNULL(b.aantal,0) as combo_aantal,
    a.userid 
from 
    d2ol_userdagstats as a 
left join 
    d2ol_userhalfuurstats as b 
on 
    a.userid=b.userid 
group by 
    a.userid 
order by 
    combo_aantal desc;