where in et version mysql

Invité
Invité n'ayant pas de compte PHPfrance

31 janv. 2008, 05:16

Bonjour à tous,

J'ai créé la requete suivante(subselect) qui marche très bien a partir de mysql 4.1.
SELECT * FROM add_enseignants WHERE idens IN (SELECT id_ens FROM add_map_matieres_enseignants WHERE id_mat = $row->id)
Pb: je viens de découvrir que mon client est sur mysql 4.0 chez son hébergeur. Je voulais mettre le site en ligne la nuit car bcp de connexions la journée. il est 4h du mat et je galère à cause d'un subselect que je dois transformer en jointure.

Quelqu'un saurait-il comment traduire ce subselect en jointure?
Merci bcp pour un petit coup de pouce.

Mes tables

Code : Tout sélectionner

CREATE TABLE `add_enseignants` ( `idens` int(10) NOT NULL auto_increment, `genreens` varchar(5) character set latin1 NOT NULL default '', `nomens` varchar(100) character set latin1 NOT NULL default '', `prenomens` varchar(255) character set latin1 collate latin1_general_ci NOT NULL default '', `fonctionens` varchar(255) character set latin1 NOT NULL default '', `parcoursens` text character set latin1 NOT NULL, `emailens` varchar(255) character set latin1 collate latin1_general_ci NOT NULL default '', `cvens` varchar(255) character set latin1 collate latin1_general_ci NOT NULL default '', `photoens` varchar(255) character set latin1 collate latin1_general_ci NOT NULL default '', `publishedens` tinyint(1) NOT NULL default '0', PRIMARY KEY (`idens`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=46 ; CREATE TABLE `add_map_matieres_enseignants` ( `id` int(10) NOT NULL auto_increment, `id_mat` int(10) NOT NULL default '0', `id_ens` int(10) NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=64 ;

ViPHP
ViPHP | 5924 Messages

31 janv. 2008, 05:22

Essaye un :

Code : Tout sélectionner

SELECT * FROM add_enseignants JOIN add_map_matieres_enseignants ON add_enseignants.idens=add_map_matieres_enseignants.id_ens WHERE add_map_matieres_enseignants.id_mat = $row->id;

Invité
Invité n'ayant pas de compte PHPfrance

31 janv. 2008, 05:26

merci pour ta réponse car je suis vraiment déséspéré.
J'ai tenté ta solution qui est refusée par 4.0

ViPHP
ViPHP | 5924 Messages

31 janv. 2008, 05:29

C'est à dire ? Une erreur ?

Invité
Invité n'ayant pas de compte PHPfrance

31 janv. 2008, 05:29

je pige vraiment pas les jointures mais ça serait pas à ce niveau qu'il y a un pb?
ON add_enseignants.idens=add_enseignants.id_ens WHERE

Invité
Invité n'ayant pas de compte PHPfrance

31 janv. 2008, 05:31

pardon, ça marche. J'ai pas été capable de faire un copier/coller correct. Merci pour ce conseil.

Invité
Invité n'ayant pas de compte PHPfrance

31 janv. 2008, 05:37

sais tu ce que ça donnerait pour celle là? chuis désolé mais j'arrive plus à réfléchir...c'est la dernière.
"SELECT * FROM add_enseignants WHERE idens IN (SELECT amme.id_ens FROM add_map_matieres_enseignants as amme, add_matieres as am WHERE amme.id_mat = am.id AND am.cursus = '$showCat') ORDER BY nomens ASC"

Invité
Invité n'ayant pas de compte PHPfrance

31 janv. 2008, 05:55

pitié, je galère comme un mulet pou transformer ça.
J'avais déjà posté ici http://www.phpfrance.com/forums/voir_sujet-34510.php il y quelques temps pour ce pb, mais j'ai abandonné pour utiliser des subselect, plus simples.
c'est pas de la paresse, j'y arrive vraiment pas avec les jointures...

Invité
Invité n'ayant pas de compte PHPfrance

31 janv. 2008, 06:37

J'ai tenté ceci qui ne renvoie pas d'erreur, mais chaque enregistrement de la table add_enseignants est affiché autant de fois qu'il y a d'enregistrements.
J'ai 36 enseignants et cette requete me renvoie 36*36 résultats, avec chaque enseignant affiché 36 fois...
SELECT * FROM add_enseignants 
	JOIN add_map_matieres_enseignants as amme 
	JOIN add_matieres as am WHERE amme.id_mat = am.id AND am.cursus = '$showCat' ORDER BY nomens ASC

Invité
Invité n'ayant pas de compte PHPfrance

31 janv. 2008, 06:39

j'ai oublié de rajouter 1 table pour ma 2ème requete:

Code : Tout sélectionner

CREATE TABLE `add_matieres` ( `id` int(4) NOT NULL auto_increment, `nom` varchar(100) NOT NULL default '', `description` text NOT NULL, `duree` varchar(50) NOT NULL default '', `cursus` varchar(255) NOT NULL default '0', `optionnel` tinyint(1) NOT NULL default '0', `published` tinyint(1) NOT NULL default '0', PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=99 ;

Invité
Invité n'ayant pas de compte PHPfrance

31 janv. 2008, 06:53

Un autre essai qui donne le même résultat indésirable que ci dessus:
"SELECT * FROM add_enseignants 
	JOIN add_map_matieres_enseignants as amme ON amme.id_mat = am.id
	JOIN add_matieres as am ON am.cursus = '$showCat' ORDER BY nomens ASC"

Invité
Invité n'ayant pas de compte PHPfrance

31 janv. 2008, 07:16

nuit blanches quand tu nous prends...g me sens trèèès seul là.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

31 janv. 2008, 08:58

Puisque tu as l'air désespéré, je vais directement te donner ce qui me semble être la solution, mais je pense que tu devrais te pencher sur les jointure, une fois que tu auras dormis.

Surtout que si tu as compris le principe des sous-requêtes, ça ne devrait pas être trop difficile ;)

Code : Tout sélectionner

SELECT * FROM add_enseignants ae, add_map_matieres_enseignants as amme, add_matieres as am WHERE amme.id_mat = am.id AND ae.idens = amme.id_ens AND am.cursus = '$showCat' ORDER BY nomens ASC
Pour tes recherches futures, cette requête, sous MySQL, est l'équivalent de

Code : Tout sélectionner

SELECT * FROM add_enseignants ae JOIN add_map_matieres_enseignants as amme ON ae.idens = amme.id_ens JOIN add_matieres as am ON amme.id_mat = am.id WHERE am.cursus = '$showCat' ORDER BY nomens ASC
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer