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 x : Sélectionner tout - Visualiser dans une fenêtre à part
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
       ...
Code x : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
Table `event` :

 `id`       `date`
-----------------------
   1      2009-01-01
   2      2009-01-04
J'aimerais donc, pour l'enregistrement 1, afficher quelque chose de similaire à :

Code x : Sélectionner tout - Visualiser dans une fenêtre à part
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 :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
Ce qui me ressortait évidemment qu'une seule ligne. J'ai donc rajouté un IS NULL sur l'id :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 )
Sauf que du coup, je n'ai pas la ligne vide correspondant au 2009-01-04.

Après plusieurs tentatives infructueuses je suis arrivé à ça qui fonctionne très bien :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
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"
Mais est-ce une technique très utilisée de mettre des AND dans le FROM ?

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 ?