Jump to content
Sign in to follow this  
sebus

Questions pour un SELECT

Rate this topic

Recommended Posts

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

Edited by sebus

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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;

Share this post


Link to post
Share on other sites
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)

Share this post


Link to post
Share on other sites

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

Merci !

Share this post


Link to post
Share on other sites
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 :)

Share this post


Link to post
Share on other sites

Pourtant, cela réponds à ta demande ou alors, on a encore rien compris ^^

Share this post


Link to post
Share on other 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 !

Share this post


Link to post
Share on other 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.

Share this post


Link to post
Share on other 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...

Edited by captain_torche

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other 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

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this  

×
×
  • Create New...