Aller au contenu

Questions pour un SELECT


sebus

Sujets conseillés

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é par sebus
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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;

Lien vers le commentaire
Partager sur d’autres sites

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 !

Lien vers le commentaire
Partager sur d’autres sites

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_id
INNER JOIN base_annuaire_cat b2 ON b2.annu_id = b.annu_id
WHERE 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.

Lien vers le commentaire
Partager sur d’autres sites

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é par captain_torche
Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

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

Lien vers le commentaire
Partager sur d’autres sites

Ceci répondrait-il à ta demande ?

Select BASE_annuaire.annu_id, BASE_annuaire.annu_societe, BASE_annuaire.email, BASE_categorie.cat_lib FROM BASE_annuaire
JOIN BASE_annuaire_cat ON BASE_annuaire_cat.annu_id = BASE_annuaire.annu_id
JOIN BASE_categorie ON BASE_annuaire_cat.cat_id = BASE_categorie.cat_id
WHERE BASE_annuaire_cat.cat_id = 1 OR BASE_annuaire_cat.cat_id = 2;

@+

cadou

Lien vers le commentaire
Partager sur d’autres sites

Veuillez vous connecter pour commenter

Vous pourrez laisser un commentaire après vous êtes connecté.



Connectez-vous maintenant
×
×
  • Créer...