Aller au contenu

Questions pour un SELECT


Sujets conseillés

Posté (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é par sebus
Posté

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

Posté

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;

Posté
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)

Posté

Non plus... Mais je vais chercher un peu plus de mon côté si je ne demande pas quelque chose d'incohérent.

Merci !

Posté
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 :)

Posté
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 !

Posté

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.

Posté (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é par captain_torche
Posté

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

Posté

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

Posté

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

Veuillez vous connecter pour commenter

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



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