J'ai 3 tables : user, competition et user_competition.
Un user participe à 0..n competitions.
Une compétition a de 0...n users.
On retrouve dans user_competition user_id, competition_id et d'autres infos (classement, forfait etc...) avec uc_id comme clé primaire.
Code : Tout sélectionner
CREATE TABLE user (
user_id int(11) NOT NULL auto_increment,
nom varchar(50) NOT NULL default '',
PRIMARY KEY (user_id)
);
CREATE TABLE competition (
competition_id int(11) NOT NULL auto_increment,
nom varchar(50) NOT NULL default '',
PRIMARY KEY (user_id)
);
CREATE TABLE user_competition (
user_id int(11) NOT NULL default '0',
competition_id int(11) NOT NULL default '0',
forfait int(4) NOT NULL default '0',
classement int(11) NOT NULL default '0',
PRIMARY KEY (uc_id),
UNIQUE KEY uk_1 (user_id, competition_id)
);
Par exemple, je veux récupérer pour chaque user le nombre de compétition auxquelles il a participé parmi les compétitions 1, 2 et 3 et pour lesquelles il n'a pas déclaré forfait.
Voilà la requête qui me semble logique
Code : Tout sélectionner
SELECT user.nom, COUNT(uc.uc_id) FROM user LEFT JOIN user_competition as uc ON user.user_id=uc.user_id WHERE uc.competition_id IN (1,2,3) AND uc.forfait=0 GROUP BY uc.user_id
Dans la doc de MySQL il est mentionné qu'il faut faire un WHERE champs is null pour récupérer les ligne de la table de gauche sans correspondance à droite mais j'ai du mal à trouver la bonne syntaxe, je ne récupère pas ce que je veux.
Quelqu'un peut-il m'éclairer là-dessus?
Merci d'avance.
EDIT :
En fait en faisant :
Code : Tout sélectionner
SELECT user.nom, COUNT(uc.uc_id) FROM user LEFT JOIN user_competition as uc ON user.user_id=uc.user_id WHERE (uc.competition_id IN (1,2,3) OR uc.competition_id is null) AND (uc.forfait=0 OR uc.forfait is null) GROUP BY uc.user_id
Et là je sèche vraiment