Bonjour,
J'ai trois tables liées par des clefs étrangères à une quatrième:
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 CREATE TABLE t_player( plr_id INT PRIMARY KEY, plr_name VARCHAR(30) NOT NULL, plr_fname VARCHAR(30) NOT NULL, ) ENGINE=InnoDB; CREATE TABLE t_record( rec_id INT PRIMARY KEY AUTO_INCREMENT, rec_datetime DATETIME NOT NULL ) ENGINE=InnoDB; CREATE TABLE t_condition( cdn_id INT PRIMARY KEY AUTO_INCREMENT, cdn_tsi INT NOT NULL, ) ENGINE=InnoDB; CREATE TABLE t_history( fk_rec_id INT NOT NULL, fk_plr_id INT NOT NULL, fk_cdn_id INT NOT NULL, PRIMARY KEY (fk_plr_id, fk_rec_id), FOREIGN KEY (fk_rec_id) REFERENCES t_record(rec_id), FOREIGN KEY (fk_plr_id) REFERENCES t_player(plr_id), FOREIGN KEY (fk_cdn_id) REFERENCES t_condition(cdn_id) ) ENGINE=InnoDB;
Je souhaite obtenir pour chaque joueur (t_player), la liste des valeurs TSI (t_condition) pour toutes les dates d'enregistrement (t_record): ce qui implique des valeurs null pour les valeurs TSI à certaines dates où les joueurs sont partis ou pas encore arrivés dans l'équipe.
Le problème c'est qu'à empiler des jointures, ces valeurs null ont tendances à se faire la malle pour des raisons qui m'échappent.
Après avoir bien bataillé, j'ai fini par aboutir à ça (qui fonctionne parfaitement):
Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 WITH x AS ( SELECT plr_id, plr_name, plr_fname, rec_id, rec_datetime FROM t_player CROSS JOIN t_record ) SELECT x.plr_name AS 'Name', x.plr_fname AS Forname, GROUP_CONCAT(COALESCE(c.cdn_tsi, '') ORDER BY x.rec_datetime) AS TSI FROM t_history h RIGHT JOIN x ON x.plr_id = h.fk_plr_id AND x.rec_id = h.fk_rec_id LEFT JOIN t_condition c ON h.fk_cdn_id = c.cdn_id GROUP BY x.plr_id ORDER BY x.plr_name, x.plr_fname
N'y a-t-il pas plus simple?
Partager