Selection d'une table en rapport avec une autre.

Eléphanteau du PHP | 31 Messages

11 mars 2010, 13:38

Bonjour,

J'ai une table contenant des évènements :
CREATE TABLE `evenements` (  
  `id` int(8) NOT NULL AUTO_INCREMENT,
  `Nom` varchar(50) NOT NULL,
  `Debut` date NOT NULL,
  `Fin` date NOT NULL,
  PRIMARY KEY  (`id`),
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

Ainsi qu'une table contenant les inscriptions à ces évènements :
CREATE TABLE `evenements_inscriptions` (  
  `inscr_id` int(8) NOT NULL AUTO_INCREMENT,
  `evenement_id` int(8) NOT NULL,
  `client_id` int(8) NOT NULL
  PRIMARY KEY  (`inscr_id`),
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;
je cherche à sélectionner tous les évènements auxquelles un client ne participe pas.
J'ai fait :
SELECT e.`id`, e.`Nom` 
FROM `evenements` e
INNER JOIN `evenements_inscriptions` i
    ON (e.`id` <> i.evenement_id AND i.client_id = '3924')
WHERE e.Fin >= '2010-03-11'
ORDER BY e.Debut
Ca fonctionne comme il faut si mon client est déjà inscrits à au moins un évènement, mais il ne me retourne rien si le client n'est pas encore inscrit !
Comment faire pour lui dire "ON (e.`id` <> i.evenement_id AND i.client_id = '3924' MEME_SI i.client_id = introuvable)" ?

Merci de votre aide.
Const.

JeanBap
Invité n'ayant pas de compte PHPfrance

11 mars 2010, 20:59

Remarques:
les tables sont fausses essayent avec:
CREATE TABLE `evenements` (  
  `id` int(8) NOT NULL AUTO_INCREMENT,
  `Nom` varchar(50) NOT NULL,
  `Debut` date NOT NULL,
  `Fin` date NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;

CREATE TABLE `evenements_inscriptions` (  
  `inscr_id` int(8) NOT NULL AUTO_INCREMENT,
  `evenement_id` int(8) NOT NULL,
  `client_id` int(8) NOT NULL
  PRIMARY KEY  (`inscr_id`)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=1;
Dans tes tables tu as par exemple:
evenement
1, toto, 20091231, 20100101
2, toto1, 20091231, 20100101
evenement_inscription
1,1,12
2,2,13


Avec une jointure externe:

disons que ton client_id 14 n'est pas présent dans la table evenement_inscriptions...
SELECT evenements. *
FROM evenements
LEFT JOIN evenements_inscriptions ON evenement_id = id
AND client_id =14
WHERE evenement_id IS NULL

Eléphanteau du PHP | 13 Messages

11 mars 2010, 21:14

Petite précision:
si tu peux modifier les tables mets une clef étrangere entre les 2 tables (c'est un peu plus propre) et rajoute une virgule entre client_id et primary key dans la 2eme..

Eléphanteau du PHP | 31 Messages

22 mars 2010, 09:53

Petite précision:
si tu peux modifier les tables mets une clef étrangere entre les 2 tables (c'est un peu plus propre) et rajoute une virgule entre client_id et primary key dans la 2eme..
En fait, mes tables ne sont pas exactement comme ça mais bien plus compliquées, j'ai donc simplifié et j'ai dû oublier un truc ^^

Donc ca fonctionne, voilà ma requête finale :
SELECT evenements. *
FROM evenements
LEFT JOIN evenements_inscriptions ON evenement_id = id
AND client_id = 3786
WHERE evenements.Debut >= '2010-01-01'
AND evenement_id IS NULL
ORDER BY `Debut`
Par contre, ce qui m'énerve, c'est que je ne la comprends pas vraiment... je n'arrive pas à la "lire en français".
Comment, en langage normale, traduire "LEFT JOIN" ?

Une réponse en plus serait agréable :p
Const.