Bonjour,
Le description de mon problème est assez simple. J'ai une table avec chaque jour de l'année au format DATE.
J'ai des enregistrements dans une autre table, mais qui n'ont pas lieu tous les jours.
J'aimerais, par liaison entre les deux tables, afficher l'ensemble des jours, même s'il n'y a pas d'enregistrement correspondant à cette date dans la deuxième table.
Exemples de données :
Code:
1
2
3
4
5
6
7
8
9
10
11 Table `date` : `jour` ---------------- ... 2009-01-01 2009-01-02 2009-01-03 2009-01-04 2009-01-05 ...
J'aimerais donc, pour l'enregistrement 1, afficher quelque chose de similaire à :Code:
1
2
3
4
5
6 Table `event` : `id` `date` ----------------------- 1 2009-01-01 2 2009-01-04
Code:
1
2
3
4
5
6
7 `jour` `id` `date` --------------------------------------- 2009-01-01 1 2009-01-01 2009-01-02 NULL NULL 2009-01-03 NULL NULL 2009-01-04 NULL NULL 2009-01-05 NULL NULL
J'ai essayé de plusieurs manières :
Ce qui me ressortait évidemment qu'une seule ligne. J'ai donc rajouté un IS NULL sur l'id :Code:
1
2
3
4
5
6
7 SELECT * FROM `date` d LEFT JOIN `event` e ON d.`jour` = e.`date` WHERE d.`jour` BETWEEN "2009-01-01" AND "2009-01-05" AND e.`id` = 1
Sauf que du coup, je n'ai pas la ligne vide correspondant au 2009-01-04.Code:
1
2
3
4
5
6
7 SELECT * FROM `date` d LEFT JOIN `event` e ON d.`jour` = e.`date` WHERE d.`jour` BETWEEN "2009-01-01" AND "2009-01-05" AND ( e.`id` = 1 OR e.`id` IS NULL )
Après plusieurs tentatives infructueuses je suis arrivé à ça qui fonctionne très bien :
Mais est-ce une technique très utilisée de mettre des AND dans le FROM ?Code:
1
2
3
4
5
6
7 SELECT * FROM `date` d LEFT JOIN `event` e ON d.`jour` = e.`date` AND e.`id` = 1 WHERE d.`jour` BETWEEN "2009-01-01" AND "2009-01-05"
Ici mon exemple est simplifié, mais j'ai 5 ou 6 conditions relatives à ma table event, donc dois-je toutes les mettre dans le FROM également ?
:merci: