sebus Posté 29 Novembre 2006 Posté 29 Novembre 2006 (modifié) Bonjour, Voici le problème que je ne sais pas résoudre : J'ai une table qui lie d'un coté une table de fiches à une table catégories. Une fiche peut appartenir à plusieures catégories. Exemple : annu_id = 10 (identifiant de la fiche 10) annu_id = 11 (identifiant de la fiche 11) cat_id = 1 (identifiant de la catégorie 1) cat_id = 2 (identifiant de la catégorie 2) La fiche 10 est caractérisé par deux catégories et la 11 par une seule : 10 ->1 10 ->2 11 ->1 QUESTION : Comment formuler une requête qui me retourne l'identifiant (annu_id) des fiches qui sont caractérisées par les cat_id = 1 ET cat_id = 2 ? En clair je veux dans mon exemple que me soit retourné seulement l'annu_id = 10... Je ne présume en rien de la complication ou simplicité de ce problème, alors toutes vos infos sont les bienvenues ! Merci, Sebus Modifié 29 Novembre 2006 par sebus
Portekoi Posté 29 Novembre 2006 Posté 29 Novembre 2006 Bonjour, Je n'ai pas compris ton schéma mais voici une requête qui je pense pourra aider Select a.annu_id from fiches a inner join categories b on a.annu_id = b.annu_id where b.cat_id in (1,2) A toute Portekoi
sebus Posté 29 Novembre 2006 Auteur Posté 29 Novembre 2006 Hum, ça ne fonctionne pas. Je vais essayer d'être plus clair : J'ai des fiches d'annuaire qui appartiennent à une catégorie "client" et à une catégorie "design" Une même fiche peut donc être présente dans plusieurs catégories. Je veux faire une requête qui me retourne les fiches qui sont présentes dans les deux catégories "client" et "design". Il faut que cette condition soit strictement validée. C'est à dire que je ne veux pas les fiches qui sont seulement dans la catégorie "client" ou celles qui sont seulement dans la catégorie "design" Merci ! ---- schéma des bases pour ceux que çà aide ! CREATE TABLE `BASE_annuaire` ( `annu_id` int(11) unsigned NOT NULL auto_increment, `annu_societe` varchar(255) default NULL, `annu_email` varchar(255) default NULL, `annu_message` text, `annu_newsletter` enum('oui','non','essayer','fax','courrier') NOT NULL default 'oui', `dateheure` datetime NOT NULL default '0000-00-00 00:00:00', `annu_adresse_1` varchar(255) default NULL, `annu_adresse_2` varchar(255) default NULL, `annu_cp` varchar(255) default NULL, `annu_ville` varchar(255) default NULL, `annu_pays` varchar(255) default NULL, `annu_tel1` varchar(100) default NULL, `annu_tel2` varchar(100) default NULL, `annu_fax` varchar(100) default NULL, `annu_activite` text, `annu_url` varchar(255) default NULL, `annu_infos_sup` text, `annu_logo` varchar(255) default NULL, `annu_proprietaire` mediumint(8) NOT NULL default '0', PRIMARY KEY (`annu_id`), KEY `societe` (`annu_societe`), KEY `annu_email` (`annu_email`), KEY `annu_proprietaire` (`annu_proprietaire`)) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- -------------------------------------------------------- -- -- Structure de la table `BASE_annuaire_cat`-- CREATE TABLE `BASE_annuaire_cat` ( `annu_id` smallint(6) NOT NULL default '0', `cat_id` smallint(6) NOT NULL default '0', PRIMARY KEY (`annu_id`,`cat_id`)) ENGINE=MyISAM DEFAULT CHARSET=latin1; -- -------------------------------------------------------- -- -- Structure de la table `BASE_categorie`-- CREATE TABLE `BASE_categorie` ( `cat_id` smallint(1) NOT NULL auto_increment, `cat_lib` varchar(255) NOT NULL default '', PRIMARY KEY (`cat_id`), KEY `cat_lib` (`cat_lib`)) ENGINE=MyISAM DEFAULT CHARSET=latin1;
Portekoi Posté 29 Novembre 2006 Posté 29 Novembre 2006 Select a.annu_id from BASE_annuaire_cat a inner join BASE_categorie b on a.cat_id = b.cat_id where (cat_id = 1 ) and (cat_id = 2)
sebus Posté 29 Novembre 2006 Auteur Posté 29 Novembre 2006 Non plus... Mais je vais chercher un peu plus de mon côté si je ne demande pas quelque chose d'incohérent. Merci !
Damon Posté 29 Novembre 2006 Posté 29 Novembre 2006 Select annu_id from BASE_annuaire_cat where cat_id=1 AND cat_id=2
sebus Posté 30 Novembre 2006 Auteur Posté 30 Novembre 2006 Select annu_id from BASE_annuaire_cat where cat_id=1 AND cat_id=2 Non ça ne peut pas marcher comme ça non plus, ça serait trop simple
Portekoi Posté 30 Novembre 2006 Posté 30 Novembre 2006 Pourtant, cela réponds à ta demande ou alors, on a encore rien compris
sebus Posté 30 Novembre 2006 Auteur Posté 30 Novembre 2006 Pourtant, cela réponds à ta demande ou alors, on a encore rien compris Je pense que je ne me suis pas bien fait comprendre, je vais préparer un petit schéma Merci de vos contributions !
captain_torche Posté 30 Novembre 2006 Posté 30 Novembre 2006 Je viens de tenter avec une double jointure sur la table base_annuaire_cat, ça semble marcher : SELECT a.annu_id FROM base_annuaire a INNER JOIN base_annuaire_cat b ON a.annu_id = b.annu_idINNER JOIN base_annuaire_cat b2 ON b2.annu_id = b.annu_idWHERE b.cat_id = 1 AND b2.cat_id = 2 Le problème est qu'il faudra autant de jointures sur cette table que tu veux tester de paramètres.
sebus Posté 30 Novembre 2006 Auteur Posté 30 Novembre 2006 (modifié) Oui je comprends ce que tu veux dire, et c'est pour ça que je me demande s'il n'y a pas une incohérence dans ma demande... Modifié 30 Novembre 2006 par captain_torche
hit7374 Posté 30 Novembre 2006 Posté 30 Novembre 2006 bonjour, je chercherais dans l'autre sens dans BASE_annuaire_cat voir s'il y a plusieurs enregistrements avec contenu de ton champ annu_id identiques à une valeur donnée. a+ JP
sebus Posté 30 Novembre 2006 Auteur Posté 30 Novembre 2006 Je me dis aussi que je peux procéder différemment : au lieu de vouloir faire une seule requête, il est peut-être plus simple que faire plusieurs requête et construire ainsi une première liste de résultat sur laquelle on appliquera le filtre suivant et ainsi de suite jusqu'à obtenir la liste finale ... Edit modérateur : Inutile de citer le message précédent
cadoudal56 Posté 30 Novembre 2006 Posté 30 Novembre 2006 Ceci répondrait-il à ta demande ? Select BASE_annuaire.annu_id, BASE_annuaire.annu_societe, BASE_annuaire.email, BASE_categorie.cat_lib FROM BASE_annuaireJOIN BASE_annuaire_cat ON BASE_annuaire_cat.annu_id = BASE_annuaire.annu_idJOIN BASE_categorie ON BASE_annuaire_cat.cat_id = BASE_categorie.cat_idWHERE BASE_annuaire_cat.cat_id = 1 OR BASE_annuaire_cat.cat_id = 2; @+ cadou
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant