Construction d'une requete sur plusieurs tables

eru
Eléphanteau du PHP | 39 Messages

21 janv. 2010, 16:25

Bonjour a tous,

Encore une fois je fais appelle à vos lumières svp, car malgré mes (médiocres) connaissances et mes recherches sur le net, je n'arrive pas à construire une requête.

J'ai une base construite sur le modèle suivant :
Table 1 => Clé 1, données...
Table 2 => Clé 2, données...
Table 3 => Clé 3, Clé 1, Clé 2, données

En toute logique les entrées de la table 3 sont liées par leurs clés respectives aux tables 1 et 2 (c'est a dire une clé 1 et une clé 2 pour chaque entrée 3).
Donc pour une même entrée dans la table 1, je peux avoir plusieurs entrées associées dans la table 3.

La requete que je souhaite faire consiste a chercher quelle entrée de la table 1 est associée aux entrées de la table 3 en fonction des clé 2 que je spécifie. Ce que je souhaite c'est que la requete ne me renvoie que les entrées satisfaisant à toutes les conditions spécifiées.

Pour être plus précis si je spécifie les 'clés 2' XX et YY, alors je ne veux que les entrées de la table 1 associées à une entrée de la table 3 XX ET et une entrée de la table 3 YY. Je ne souhaite pas de OU.

Voici donc ce que j'ai déjà essayé :

Code : Tout sélectionner

SELECT Table1.* FROM table 1 JOIN table3 ON (table1.clé1= table3.clé3 AND (table3.clé2 = 'XX' OR table3.clé2 = 'YY' ));
mais le problème est que ceci me donne toutes les entrées ayant XX ou YY or je souhaite n'avoir que celle qui satisfont aux deux conditions soit XX et YY
(bien évidemment , en remplacant OR par AND, ça ne marche pas)

J'espère avoir été assez clair dans mes explications.
Merci de votre temps.

ViPHP
ViPHP | 2291 Messages

21 janv. 2010, 18:29

Salut,

Ceci donne quoi ?
$Requete = " SELECT T1.*, T2.*, T3.*
             FROM table1 T1, table2 T2, table3 T3
             WHERE T1.cle = T3.cle
             AND T3.cle = 'XX'
             AND T3.cle = 'YY' ";
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

eru
Eléphanteau du PHP | 39 Messages

21 janv. 2010, 18:52

Bonjour dunbar,

Je viens d'essayer, mais malheureusement SQL ne renvoit aucune information. Si une seule clé est donnée ca marche, mais 2 il ne veut pas.

ViPHP
ViPHP | 2291 Messages

21 janv. 2010, 19:06

Remplace le deuxième AND par OR :idea:
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

eru
Eléphanteau du PHP | 39 Messages

21 janv. 2010, 20:03

J'ai essayé, le problème est que SQL me renvoit tous les entrées de la table1 contenant ou xx ou yy, mais pas uniquement celle qui ont les deux.
(par ailleurs j'ai du ajouter un DISTINCT car il renvoyait une quantité phénoménale d'entrée :) )

ViPHP
ViPHP | 2291 Messages

21 janv. 2010, 20:08

Montre ta table stp
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

eru
Eléphanteau du PHP | 39 Messages

21 janv. 2010, 20:19

J'avais évidemment bien simplifié les tables (en vrai il y en a une 10 aine d'imbriquées ) :!:
Je te mets le SQL
(merci de prendre du temps :D )
-- 
-- Structure de la table `actes_pec` = TABLE1
-- 

CREATE TABLE `actes_pec` (
  `IDPEC` int(100) NOT NULL auto_increment,
  `IDS` int(100) NOT NULL,
  `IDA` int(100) NOT NULL,
  `IDV` int(100) NOT NULL,
  `date` date NOT NULL,
  `heure` varchar(20) collate utf8_unicode_ci NOT NULL,
  `motif` text collate utf8_unicode_ci NOT NULL,
  `diagnostic` varchar(100) collate utf8_unicode_ci NOT NULL,
  `qtt` decimal(10,2) NOT NULL,
  `remise` decimal(10,2) NOT NULL,
  `sortie` varchar(15) collate utf8_unicode_ci NOT NULL default '0',
  KEY `IDPEC` (`IDPEC`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=119 ;


-- 
-- Structure de la table `actes` = TABLE2
-- 

CREATE TABLE `actes` (
  `IDAC` int(255) NOT NULL auto_increment,
  `titleg` varchar(255) collate utf8_unicode_ci NOT NULL,
  `tva` decimal(10,2) NOT NULL,
  `pu` decimal(10,2) NOT NULL,
  `categorie` int(100) NOT NULL,
  KEY `IDAC` (`IDAC`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=133 ;


-- 
-- Structure de la table `actes_users` = TABLE3
-- 

CREATE TABLE `actes_users` (
  `IDAU` int(100) NOT NULL auto_increment,
  `IDPECAU` int(100) NOT NULL,
  `IDACAU` int(100) NOT NULL,
  `IDMAU` int(100) NOT NULL,
  `IDSAU` int(100) NOT NULL default '1',
  `typeAU` varchar(100) collate utf8_unicode_ci NOT NULL,
  `dateAU` date NOT NULL,
  `heureAU` varchar(20) collate utf8_unicode_ci NOT NULL,
  `qttAU` decimal(10,2) NOT NULL,
  `remiseAU` decimal(10,2) NOT NULL,
  `ttcAU` decimal(10,2) NOT NULL,
  KEY `IDAU` (`IDAU`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1522 ;

ViPHP
ViPHP | 2291 Messages

21 janv. 2010, 20:31

Et tes relations stp
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.

eru
Eléphanteau du PHP | 39 Messages

21 janv. 2010, 20:47

ah oui désolé :oops:
alors actes_users est lié par IDPECAU a actes_pec avec (clé : IDPEC)
et par IDACAU à actes par (clé : IDAC)
C'est assez clair?

eru
Eléphanteau du PHP | 39 Messages

22 janv. 2010, 19:09

J'ai retenté ma chance avec d'autres types de jointures (RIGHT, LEFT, INNER...), sans aucun succès malheureusement.
#-o

ViPHP
ViPHP | 2291 Messages

22 janv. 2010, 20:11

J'ai pas d'autre solutions sorry
ImageCe que l'on apprend par l'effort reste toujours ancré beaucoup plus longtemps.