Selection d'une table en rapport avec une autre.

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Selection d'une table en rapport avec une autre.

Re: Selection d'une table en rapport avec une autre.

par Const » 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

Re: Selection d'une table en rapport avec une autre.

par jeanBap » 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..

Re: Selection d'une table en rapport avec une autre.

par JeanBap » 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

Selection d'une table en rapport avec une autre.

par Const » 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.