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 ...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 Table `event` : `id` `date` ----------------------- 1 2009-01-01 2 2009-01-04
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 :
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
Sauf que du coup, je n'ai pas la ligne vide correspondant au 2009-01-04.
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 )
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 : 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"
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 ?
![]()
Partager