mesures <NULL> de SQL: pourquoi ne pas les ignorer?

Une question, un bug ?
Répondre
froggy2
Nouveau membre
Messages : 4
Inscription : ven. juin 12, 2009 4:34 pm

mesures <NULL> de SQL: pourquoi ne pas les ignorer?

Message par froggy2 »

J'ai deux bases de données météo MySQL. Je veux les réunir par une view de telle sorte que graphweather n'y accède qu'à travers un seul de ses trois plugin.
On y arrive très bien avec une view du type union de deux left join:

select unix_timestamp(concat(date_format(`meteo2`.`mdate`,'%Y%m%d'),date_format(`meteo2`.`mtime`,'%H%i%s'))) AS `unixtime`,`meteo2`.`mdate` AS `mdate`,`meteo2`.`mtime` AS `mtime`,`meteo2`.`out_temp` AS `out_temp`,`meteo`.`in_temp` AS `in_temp` from (`meteo2` left join `meteo` on((`meteo2`.`mtime` = `meteo`.`mtime`)))
union
select unix_timestamp(concat(date_format(`meteo`.`mdate`,'%Y%m%d'),date_format(`meteo`.`mtime`,'%H%i%s'))) AS `unixtime`,`meteo`.`mdate` AS `mdate`,`meteo`.`mtime` AS `mtime`,`meteo2`.`out_temp` AS `out_temp`,`meteo`.`in_temp` AS `in_temp` from (`meteo` left join `meteo2` on((`meteo2`.`mtime` = `meteo`.`mtime`))) order by `mtime`

Le résultat au niveau sortie base de donnée est impeccable:
1244722833 2009-06-11 14:05:33 31 10
1244722200 2009-06-11 14:10:00 30 <NULL>
1244722770 2009-06-11 14:19:30 <NULL> 10.5

Dans la première ligne les deux bases de données ont un timestamp commun toutes les données sont dispo sur une même ligne.
Dans la seconde ligne, la seconde base de donnée n'a pas de donnée au timestamp 1244722200, donc la base de donnée renvoie <NULL>. Ce n'est pas la valeur zéro, ça signifie que la donnée n'est pas disponible.

Le problème: graphweather n'ignore pas ces données <Null>, mais il les remplace par la valeur zéro....N'est-il pas possible tout simplement de les ignorer et donc au niveau affichage d'afficher la dernière valeur connue?
Avatar de l’utilisateur
TiToine
Site Admin
Messages : 3356
Inscription : lun. mars 20, 2006 11:16 am
Localisation : Montréal
Contact :

Re: mesures <NULL> de SQL: pourquoi ne pas les ignorer?

Message par TiToine »

Ce serait possible de me donner l'accès à ta base?
Sinon le champ à quel type?
A mon avis c'est le driver ODBC qui remplace cette valeur par 0.
froggy2
Nouveau membre
Messages : 4
Inscription : ven. juin 12, 2009 4:34 pm

Re: mesures <NULL> de SQL: pourquoi ne pas les ignorer?

Message par froggy2 »

Les champs avec des valeurs de températures sont de type float.
mysql> describe t1;
+-------+-------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------+------+-----+---------+-------+
| mdate | date | YES | | NULL | |
| mtime | time | YES | | NULL | |
| temp | float | YES | | NULL | |
+-------+-------+------+-----+---------+-------+
3 rows in set (0.02 sec)

mysql> describe t2;
+-------+-------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+-------+------+-----+---------+-------+
| mdate | date | YES | | NULL | |
| mtime | time | YES | | NULL | |
| temp | float | YES | | NULL | |
+-------+-------+------+-----+---------+-------+
3 rows in set (0.02 sec)


Quelques infos sur la config:
-mysql sur pc windows xp.
-Driver ODBC "MySQL Connector" : http://dev.mysql.com/downloads/connecto ... html#win32

Mes tables meteo et meteo2 étaient construites avec l'engine "CSV" qui a des restrictions sur les valeurs nulls.
J'ai refais deux autres tables t1 et t2 au format InnoDB puis une view v1_meteo:

select unix_timestamp(concat(date_format(`t2`.`mdate`,'%Y%m%d'),date_format(`t2`.`mtime`,'%H%i%s'))) AS `unixtime`,`t2`.`mdate` AS `mdate`,`t2`.`mtime` AS `mtime`,`t2`.`temp` AS `out_temp`,`t1`.`temp` AS `in_temp` from (`t2` left join `t1` on((`t2`.`mtime` = `t1`.`mtime`)))
union select unix_timestamp(concat(date_format(`t1`.`mdate`,'%Y%m%d'),date_format(`t1`.`mtime`,'%H%i%s'))) AS `unixtime`,`t1`.`mdate` AS `mdate`,`t1`.`mtime` AS `mtime`,`t2`.`temp` AS `out_temp`,`t1`.`temp` AS `in_temp` from (`t1` left join `t2` on((`t2`.`mtime` = `t1`.`mtime`))) order by `mtime`

mysql> describe v1_meteo;
+----------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------+------+-----+---------+-------+
| unixtime | bigint(20) | YES | | NULL | |
| mdate | date | YES | | NULL | |
| mtime | time | YES | | NULL | |
| out_temp | float | YES | | NULL | |
| in_temp | float | YES | | NULL | |
+----------+------------+------+-----+---------+-------+
5 rows in set (0.01 sec)

Cette vue me renvoi:

mysql> select * from v1_meteo;
+------------+------------+----------+----------+---------+
| unixtime | mdate | mtime | out_temp | in_temp |
+------------+------------+----------+----------+---------+
| 1244819474 | 2009-06-12 | 17:11:14 | 11 | NULL |
| 1244820095 | 2009-06-12 | 17:21:35 | NULL | 1 |
| 1244823080 | 2009-06-12 | 18:11:20 | 12 | NULL |
| 1244823701 | 2009-06-12 | 18:21:41 | NULL | 2 |
| 1244827305 | 2009-06-12 | 19:21:45 | 13 | 3 |
+------------+------------+----------+----------+---------+
5 rows in set (0.00 sec)

Donc si je me connecte directement sur la base en ligne de commande DOS, je vois bien les NULL.
Maintenant je ne sais pas ce que renvoi le driver ODBC à graphweather...

Graphweather m'affiche bien toutes ces valeurs, mais il met des valeurs nulles à la place des "NULL".
On aimerait avoir au moins:
+------------+------------+----------+----------+---------+
| unixtime | mdate | mtime | out_temp | in_temp |
+------------+------------+----------+----------+---------+
| 1244819474 | 2009-06-12 | 17:11:14 | 11 | 0 |
| 1244820095 | 2009-06-12 | 17:21:35 | 11 | 1 |
| 1244823080 | 2009-06-12 | 18:11:20 | 12 | 1 |
| 1244823701 | 2009-06-12 | 18:21:41 | 12 | 2 |
| 1244827305 | 2009-06-12 | 19:21:45 | 13 | 3 |
+------------+------------+----------+----------+---------+

Une solution serait peut-être de trouver une requète SQL qui fait un posttraitement sur la vue v1_meteo,
de manière à éliminer les NULL et à les remplacer par la dernière valeur non "NULL" connue dans la table...
Y a-t-il un spécialiste en requètes SQL ?
froggy2
Nouveau membre
Messages : 4
Inscription : ven. juin 12, 2009 4:34 pm

Re: mesures <NULL> de SQL: pourquoi ne pas les ignorer?

Message par froggy2 »

une autre solution à ce multiplexage si jamais celà ne marche pas au travers d'une vue unique de la base de donnée, serait que l'on puisse ajouter plusieures vues dans graphweather à un seul plugin ODBC.
D'après ce que je vois ce n'est pas possible aujourd'hui puisque le bouton "ajouter" est grisé dès qu'on met la première vue.
froggy2
Nouveau membre
Messages : 4
Inscription : ven. juin 12, 2009 4:34 pm

Re: mesures <NULL> de SQL: pourquoi ne pas les ignorer?

Message par froggy2 »

voilà, finalement je m'en sort avec une astuce "de la mort":

Voici la vue magique:

select unix_timestamp(concat(date_format(`t2`.`mdate`,'%Y%m%d'),date_format(`t2`.`mtime`,'%H%i%s'))) AS `unixtime`,`t2`.`mdate` AS `mdate`,`t2`.`mtime` AS `mtime`,`t2`.`temp` AS `out_temp`,ifnull(`t1`.`temp`,99999) AS `in_temp` from (`t2` left join `t1` on((`t2`.`mtime` = `t1`.`mtime`))) union select unix_timestamp(concat(date_format(`t1`.`mdate`,'%Y%m%d'),date_format(`t1`.`mtime`,'%H%i%s'))) AS `unixtime`,`t1`.`mdate` AS `mdate`,`t1`.`mtime` AS `mtime`,ifnull(`t2`.`temp`,99999) AS `out_temp`,`t1`.`temp` AS `in_temp` from (`t1` left join `t2` on((`t2`.`mtime` = `t1`.`mtime`))) order by `mtime`

Elle me crache:

1244818895 2009-06-12 17:01:35 99999 1
1244819474 2009-06-12 17:11:14 11 1,5
1244823080 2009-06-12 18:11:20 12 99999
1244823355 2009-06-12 18:15:55 15 99999
1244823701 2009-06-12 18:21:41 99999 2
1244827305 2009-06-12 19:21:45 13 3


c'est à dire que les NULL ont été remplacés par une valeur "de la mort", c'est à dire 99999.
Celle ci sera simplement filtrée par graphweather...et donc ignorée !!! CQFD
Avatar de l’utilisateur
TiToine
Site Admin
Messages : 3356
Inscription : lun. mars 20, 2006 11:16 am
Localisation : Montréal
Contact :

Re: mesures <NULL> de SQL: pourquoi ne pas les ignorer?

Message par TiToine »

Bien joué, j'avais pas pensé au filtrage. Désolé je n'ai pas eu le temps de te répondre en privé.
Répondre