[MySQL] Null waarden?

Pagina: 1
Acties:

  • Webgnome
  • Registratie: Maart 2001
  • Laatst online: 14:22
Hoi mensen,

Ik ben nu al een paar uurjtes bezig met dit probleem en ik kom er maar niet uit. Ben op dit moment bezig met Grazestats 2 deze wil ik een stuk overzichtelijker maken. Neem bijvoorbeeld de dag totalen. Op dit moment worden deze getoond ( grazestats 1) zoals het ook in ppstats werd getoond. Dus alleen die gebruikers die ook daadwerkelijk iets hadden geflusht.

Echter nu wilde ik ook diegene latn zien die NIKS hadden geflusht. Het probleem echter is dat deze dus ook niet in de tabel voorkomen dus op 0 waarden zoeken is niet mogelijk. Om het simpel te houden.

Ik heb 2 tabellen.

de block tabel waarin per ip de blokjes worden bijgehouden die worden geflusht en een member_dns tabel. Deze laatste is de koppeltabel die ik gebruik om de gebruikers aan de ip's te binden ( in grazestats 1 is dit niet gedaan waardoor ik andere prolemen heb)

De velden per tabel:

blocks tabel
block_id
block_nr
block_ip
block_size
block_date

member_dns
ip_id
ip_adress
ip_mem_id

Nu heb ik al zitten te stoeien met dingen als iffnull, if() etc etc. Maar ik kom er maar niet uit. Elke keer krijg ik OF alleen de ip's die ook daadwerkelijk iets hebben geflusht of helemaal niks terug.

De query waar ik mee begonnen ben ( die dus alleen die ip's lat zien die hebben geflusht):

code:
1
2
3
4
select count( b.block_id ) as count , m.member_name as name
from blocks as b, members as m, member_dns as d
where b.block_date = '2003-10-23' AND b.block_ip = d.ip_adress AND d.ip_mem_id = m.member_id
group by name


En een verwoede poging van mij om di op te lossen met een if:"

code:
1
2
3
4
select if(  count( b.block_id ) = null , '0' ) as count , d.ip_adress
from blocks as b, members as m, member_dns as d
where b.block_date = '2003-10-23' AND b.block_ip = d.ip_adress AND d.ip_mem_id = m.member_id
group by name


en een verwoede poging om dit op te lossen met iffnull :
code:
1
2
3
4
select ifnull( count( b.block_id ) , 0 ) as count , m.member_name as name
from blocks as b, members as m, member_dns as d
where b.block_date = '2003-10-23' AND b.block_ip = d.ip_adress AND d.ip_mem_id = m.member_id
group by name


Alle querys gevn alleen maar die terug die ook echt in de database staan maar verder ook niks. Wie weet hoe je dit op kunt lossen ( ja ik weet dat ik dat zootje where's ook kan verkleinen met join etc :P )

offtopic:
ik voel me nu echt n00b maar ja dat ben ik ook

[ Voor 4% gewijzigd door Webgnome op 24-10-2004 02:59 ]

Strava | AP | IP | AW


Verwijderd

volgens mij moet je eens wat testen met (left) joins ...

code:
1
2
3
4
5
6
SELECT count( b.block_id ) AS count , m.member_name AS name
FROM members AS m, member_dns AS d
WHERE d.ip_mem_id = m.member_id
LEFT JOIN blocks AS b ON b.block_ip = d.ip_address
WHERE b.block_date = '2003-10-23' 
GROUP BY name


ofzoiets :/

[ Voor 71% gewijzigd door Verwijderd op 24-10-2004 03:22 ]


  • Webgnome
  • Registratie: Maart 2001
  • Laatst online: 14:22
Ik heb al met joins lopen klooien maar dan krijg ik nog steeds maar die records waar ook daadwerkelijk een overeenkomst is ( oftewel als er op 1 dag 3 mensen hebben geflusht krijg ik ook maar 3 records terug terwijl ik 10 ip adressen heb en dus 7 keer 0 zou moeten krijgen )

deze query doet het dus niet ( die ik al had geprobeert maar dan in een andere vorm )

code:
1
2
3
4
5
SELECT ifnull( count( blocks.block_id ), 0 ) AS count , m.member_name AS name
FROM members AS m, member_dns AS d
LEFT JOIN blocks  ON blocks.block_ip = d.ip_adress
WHERE d.ip_mem_id = m.member_id AND blocks.block_date = '2003-10-23' 
GROUP BY name

[ Voor 4% gewijzigd door Webgnome op 24-10-2004 03:48 ]

Strava | AP | IP | AW


  • pjotrk
  • Registratie: Mei 2004
  • Laatst online: 15-07-2025
joins zijn inderdaad de eenvoudigste manier om dit op te lossen.

Ik weet niet heel erg precies wat je als uitvoer wilt hebben, maar ik denk dat dit iig al wat meer in de richting is:

code:
1
2
3
4
5
6
select count( b.block_id ) as count, m.member_name as name
from members as m 
  left join member_dns as d on (d.ip_mem_id = m.member_id)  
  left join blocks as b on (b.block_ip = d.ip_adress)
where b.block_date = '2003-10-23'
group by name;

  • Webgnome
  • Registratie: Maart 2001
  • Laatst online: 14:22
en toch werkt het niet :(. Als ik de volgende query uitvoer. Oftewel met een niet bestaan ip adres hard gecodeerd dan werkt de iffnull wel :?

code:
1
2
3
select ifnull( count( block_id ) , 0 ) as count
from blocks
where block_date = '2003-10-23' AND block_ip = '10.0.0.1'


komt netjes

count
0

[ Voor 9% gewijzigd door Webgnome op 24-10-2004 03:58 ]

Strava | AP | IP | AW


  • pjotrk
  • Registratie: Mei 2004
  • Laatst online: 15-07-2025
ummz oja stom 8)7:
"where b.block_date = '2003-10-23'"

misschien dan zo, maar ik kan het zelf niet testen:
code:
1
2
3
4
5
6
SELECT count( b.block_id ) AS count, m.member_name AS name
FROM members AS m
  LEFT JOIN member_dns AS d ON ( d.ip_mem_id = m.member_id ) 
  LEFT JOIN blocks AS b ON ( b.block_ip = d.ip_adress ) 
WHERE b.block_date = '2003-10-23' 
  OR b.block_date IS NULL

Verwijderd

ummz oja stom 8)7:
"where b.block_date = '2003-10-23'"
Daar zeg je zoiets :)

Query die pjotrk geeft zou dus moeten kloppen (kan het ook niet testen ;) )

[totaal-niet-zeker-mode]
Een punt dat er wel kan fout gaan is dat de "count( b.block_id ) AS count" een 1 teruggeeft, zelfs al staat ie er niet bij (op voorwaarde dat de count ook NULL-items meetelt)

[/totaal-niet-zeker-mode]

  • Webgnome
  • Registratie: Maart 2001
  • Laatst online: 14:22
pjotrk, ik heb ff de query getest maar voor het zelfde resultaat s gewoon selecteren moet ik nu 12 seconden wachten :+. Maar ik ga het vandaag eens verder proberen het moet me gewoon lukken :)

Strava | AP | IP | AW


Verwijderd

Staan er unieke keys/indexes op de tabellen :?

[ Voor 11% gewijzigd door Verwijderd op 24-10-2004 17:16 ]


  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

om te testen op NULL waarden moet je toch
code:
1
 WHERE iets IS NULL

gebruiken, en niet
code:
1
 WHERE iets = null

(die ifnull is waarsch een MySQL functie die mss soelaas kan bieden)

probeer ook eens je eigen query maar dan met
code:
1
SELECT COUNT(*), member_name ...

en kijk eens wat je uitvoer hiervan is...

ASSUME makes an ASS out of U and ME

Pagina: 1