MySQL Forums
Forum List  »  French

Etrange jointure?
Posted by: Michael Seguin
Date: March 31, 2009 11:01AM

Bonjour,
Je me permets de rejoindre votre communauté et de poster ici car j'avoue être un peu destabilisé.
Je vous décris mon problème, commençons par le début :

CREATE TABLE `temp_donnees` (
`id_serie` bigint(20) unsigned default NULL,
`date` date default NULL,
`valeur` double default NULL,
KEY `date` (`date`),
KEY `id_serie` (`id_serie`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

Ensuite, je remplis cette table via des procédures stockées et voici notamment quelques valeurs :

mysql> select * from temp_donnees where id_serie=5 order by date;
+----------+------------+--------------+
| id_serie | date | valeur |
+----------+------------+--------------+
| 5 | 2007-01-03 | 857.6192 |
| 5 | 2007-01-10 | 809.0625 |
[... je vous fais grâce du flood ^^ ...]
| 5 | 2009-03-12 | 725 |
| 5 | 2009-03-19 | 690 |
+----------+------------+--------------+
116 rows in set (0.00 sec)

=> 116 tuples existants.

mysql> select * from temp_donnees where id_serie=22 order by date;
+----------+------------+--------+
| id_serie | date | valeur |
+----------+------------+--------+
| 22 | 2008-11-06 | 640 |
| 22 | 2008-11-13 | 595 |
[...]
| 22 | 2009-03-12 | 500 |
| 22 | 2009-03-19 | 500 |
+----------+------------+--------+
20 rows in set (0.00 sec)

=> 20 tuples existants.

Une remarque importante : toutes les dates présentes dans la série 22, sont présentes dans la serie 5.

Je veux une requête qui me donne par date les valeurs de chacunes des séries, j'en déduis que ma requête devrait ressembler à ça :

select a.date, a.valeur, b.valeur from temp_donnees a left join temp_donnees b on a.date=b.date where a.id_serie=5 and b.id_serie=22 order by a.date;
(On notera le *left join*)

Mais là surprise :

mysql> select a.date, a.valeur, b.valeur from temp_donnees a left join temp_donnees b on a.date=b.date where a.id_serie=5 and b.id_serie=22 order by a.date;
+------------+--------+--------+
| date | valeur | valeur |
+------------+--------+--------+
| 2008-11-06 | 1025 | 640 |
| 2008-11-13 | 970 | 595 |
[...]
| 2009-03-12 | 725 | 500 |
| 2009-03-19 | 690 | 500 |
+------------+--------+--------+
20 rows in set (0.00 sec)

=> 20 tuples alors que j'en voulais 116 dont 96 valeurs nulles pour la dernière colonne.
Alors j'ai tenté tous les types de jointure de l'inner join aux left outer join, rien n'y fait. J'ai retourné ma requête dans tous les sens, je n'ai jamais réussi à avoir ce que je voulais. J'ai même essayé de passer ma table sous MyIsam croyant que c'était mon InnoDB qui battait de l'aîle ;) , ou de passer le champ date en timestamp.

Au final, j'ai trouvé une solution paliative :
mysql> select a.date, a.valeur as a, (select valeur from temp_donnees where id_serie=22 and date=a.date) as b from temp_donnees a where a.id_serie=5 order by a.date;
+------------+--------------+------+
| date | a | b |
+------------+--------------+------+
| 2007-01-03 | 857.6192 | NULL |
| 2007-01-10 | 809.0625 | NULL |
[...]
| 2009-03-12 | 725 | 500 |
| 2009-03-19 | 690 | 500 |
+------------+--------------+------+
116 rows in set (0.00 sec)

Cela dit, même si cette solution fonctionne, j'aimerais bien comprendre pourquoi ma première solution ne fonctionne pas.
Pour info, j'ai testé avec les versions 5.0.45 et 5.0.70, respectivement sous debian et gentoo et ça ne change rien.
C'est peut-être une erreur bête et même si c'est le cas, merci de m'éclairer histoire que je ne refasse pas la même plus tard :)

Merci par avance pour vos réponses,
Michael.

PS : Pour cet exemple précis, je ne prends que deux séries, mais il faut garder à l'esprit qu'il peut y en avoir bien plus (jusqu'à 10), le but étant de générer la requête dynamiquement en PHP.

Options: ReplyQuote


Subject
Views
Written By
Posted
Etrange jointure?
7054
March 31, 2009 11:01AM
4048
March 31, 2009 11:17AM
3653
April 01, 2009 02:54AM
3891
April 02, 2009 10:19AM
3394
April 02, 2009 11:12AM
3445
April 02, 2009 11:11PM


Sorry, you can't reply to this topic. It has been closed.

Content reproduced on this site is the property of the respective copyright holders. It is not reviewed in advance by Oracle and does not necessarily represent the opinion of Oracle or any other party.