IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Requête mySQL désobéissante


Sujet :

PHP & Base de données

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 3
    Par défaut Requête mySQL désobéissante
    Bonjour,
    après 2 jours complets de tests inefficaces, je m'en remets à vos intelligences.
    Voici mon problème, qui semble simple (et pourtant !)
    Le but de ma requête (en simplifiant ici avec des éléments):
    Sortir des données qui contiennent des composants d'une table (avec requête et non tous ses éléments) et pas ceux de l'autre table (avec requête).
    J'ai 5 tables (Champs):
    Produit (NumProduit;NomProduit)
    Naturel (NumNaturel;NomNaturel)
    Chimique (NumChimique;NomChimique)
    NaturelProduit (NumNaturel;NumProduit) ->lie les réf des produits contenant du chimique
    ChimiqueProduit (NumChimique;NumProduit) -> lie les réf des produits contenant du chimique
    J'ai un champs formulaire dans lequel je rentre des noms de produit.
    Je rentre un nom de produit (A) et je veux qu'il m'affiche un autre produit (B) contenant au moins un des produits NATUREL contenus dans le produit (A) mais AUCUN des produits CHIMIQUEs contenus de ce même produit (A). Disons que le NumProduit du Produit(A) est 1 et celui du Produit(B) est 2. Imaginons aussi (C) que je ne veux pas voir apparaitre (car il contient des CHIMIQUEs de A).
    (A) est lié aux NumNaturel 1 et 2, (B) aux NumNaturel 2 et 3, (C) aux NumNaturel 2 et 4.
    Même liaisons pour les NumChimiques afin de simplifier.
    J'ai testé beaucoup de requêtes MySQL. La plus proche de réussir :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    Select DISTINCT `NomProduit`,
    `NumProduit`, 
    NaturelProduit.NumNaturel, 
    ChimiqueProduit.NumChimique 
    FROM 
    `Produit` 
    INNER JOIN NaturelProduit ON Produit.NumProduit = NaturelProduit.NumProduit 
    INNER JOIN ChimiqueProduit ON Produit.NumProduit  = ChimiqueProduit.NumProduit 
    WHERE NumNaturel IN (
           SELECT DISTINCT NumNaturel 
           FROM NaturelProduit 
           WHERE NaturelProduit.NumProduit = '1') 
    AND NumChimique NOT IN (
           SELECT DISTINCTNumChimique 
           FROM ChimiqueProduit 
           WHERE ChimiqueProduit.NumProduit = '1')
    La requête me semblait claire, et il devrait me lister (croyais-je, naïvement), Le produit (B) et éviter le produit (C)...
    Que nenni non point ! Il m'affiche le produit (C) contenant pourtant le NumChimique 2, contenu également dans (A).
    Il semble, par contre, que si (C) contient TOUS les CHIMIQUE de (A) (soit 1 et 2 pour A et C), celui-ci n'apparaisse pas...
    Une idée du problème ?

  2. #2
    Modérateur

    Avatar de MaitrePylos
    Homme Profil pro
    DBA
    Inscrit en
    Juin 2005
    Messages
    5 505
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : DBA
    Secteur : Service public

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 505
    Par défaut
    Il faudrais essayer sans le distinct du début et mettre des espaces ou parenthèse pour les autres.

    Pensez aussi a mettre les aliasse sur tout vos champs.

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    SELECT Produit.NomProduit, Produit.NumProduit, 
    NaturelProduit.NumNaturel, 
    ChimiqueProduit.NumChimique 
    FROM 
     Produit 
    INNER JOIN NaturelProduit ON Produit.NumProduit = NaturelProduit.NumProduit 
    INNER JOIN ChimiqueProduit ON Produit.NumProduit  = ChimiqueProduit.NumProduit 
    WHERE Produit.NumNaturel IN (
           SELECT DISTINCT(NumNaturel) 
           FROM NaturelProduit 
           WHERE NumProduit = '1') 
    AND Produit.NumChimique NOT IN (
           SELECT DISTINCT(NumChimique) 
           FROM ChimiqueProduit 
           WHERE NumProduit = '1')

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 3
    Par défaut Malheureusement
    Malheureusement, cela ne change rien.

    C'est vraiment étrange... J'ai beau décomposer le code, je ne vois vraiment pas où il y aurait une erreur...

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 3
    Par défaut petite correction
    Sur les numchimique, ils ne sont pas les mêmes que NumNaturel
    (A) est lié aux NumChimique 1 et 2, (B) aux NumChimique 3 et 4, (C) aux NumNaturel 2 et 4.

Discussions similaires

  1. Requète MySQL >> Postgresql
    Par genova dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 19/08/2005, 09h05
  2. Requête MYSQL LIKE particulière
    Par TheDarkLewis dans le forum Requêtes
    Réponses: 9
    Dernier message: 05/12/2004, 15h50
  3. Arrêt de l'exécution d'une requête MySQL dans DELPHI.
    Par joelmarc dans le forum Bases de données
    Réponses: 9
    Dernier message: 11/10/2004, 16h11
  4. surcharge de requête MySQL
    Par simoryl dans le forum Requêtes
    Réponses: 4
    Dernier message: 15/06/2004, 10h43
  5. requête mysql sous php
    Par remi59 dans le forum Débuter
    Réponses: 9
    Dernier message: 03/07/2003, 10h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo