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 :

mysql requete d'une table en fonction d'une autre


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 25
    Points : 18
    Points
    18
    Par défaut mysql requete d'une table en fonction d'une autre
    Bonjour,

    je me permets de vous écrire pour solliciter votre aide, je cherche à faire une requête, je tourne en rond et je ne trouve pas de solution.

    J'ai une première table "articles" :

    id_article nom_article actif_article

    J'ai une deuxième table "rayon" :

    id_rayon id_article classe

    Je cherche à sélectionner tous les articles de la classe x qui ne sont pas dans la table rayon.

    J'ai essayé ce genre de requête mais ça ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'SELECT `articles`.`id_article`,`nom_article`
    	  FROM `articles`
    	  WHERE `rayon`.`id_article` NOT IN("SELECT `id_article` FROM `rayon` WHERE `classe` = "x")
    	  AND `actif_article` = "oui" '

    Merci pour votre aide, j'ai essayé avec NOT EXISTS, mais ce n'est pas supporté par mon serveur.


  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    C'est l'id_article dans articles que tu cherches, pas dans rayon :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT id_article, nom_article
    	  FROM articles
    	  WHERE classe = "x"
              AND actif_article = "oui"
              AND id_article NOT IN (SELECT id_article FROM rayon)
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Alors j'ai fait ça, étant donné que la classe se trouve dans la table rayon

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT id_article, nom_article
    	  FROM articles
    	  WHERE actif_article = "oui"
              AND id_article NOT IN (SELECT id_article FROM rayon WHERE classe = "x")

    mais ça ne fonctionne pas


  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    496
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 496
    Points : 585
    Points
    585
    Par défaut
    Je cherche à sélectionner tous les articles de la classe x qui ne sont pas dans la table rayon.
    Tu veux plutôt dire "tous les articles qui ne sont pas dans les rayons de classe 'x' " (sinon il y a un soucis de structure de tes tables..)
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT id_article, nom_article
    FROM articles
    WHERE actif_article = "oui"
    AND id_article IN (SELECT id_article FROM rayon WHERE classe <> "x")

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    Tu veux plutôt dire "tous les articles qui ne sont pas dans les rayons de classe 'x'
    oui c'est ça, mais ce que tu proposes ne fonctionne pas

    J'ai remarqué que j'obtenais le même résultat avec les deux requetes suivantes :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT id_article, nom_article
    	  FROM articles
    	  WHERE actif_article = "oui"
              AND id_article NOT IN (SELECT id_article FROM rayon WHERE classe = "x")
     
    SELECT id_article, nom_article
    	  FROM articles
    	  WHERE actif_article = "oui"

    Comme s'il ne tenait pas compte de NOT IN...
    Y a t'il une autre façon de faire ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    496
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 496
    Points : 585
    Points
    585
    Par défaut
    En me relisant je me rend compte que ce que je t'ai proposé sélectionne les articles actifs qui sont pas dans les rayons de classe x..


    Mais cette requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT id_article, nom_article
    FROM articles
    WHERE actif_article = "oui"
    AND id_article NOT IN (SELECT id_article FROM rayon WHERE classe = "x")

    te retournera tous les articles actifs qui ne sont pas dans les rayons de classe x, ainsi que ceux qui ne sont carrément pas dans la table rayon du tout. Est-ce bien cela que tu veux?


    Et si tu exécutes cette requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT id_article FROM rayon WHERE classe = "x"

    Est-ce qu'elle te retourne des résultats? Si oui, est-ce que ces id_article sont présents dans la table article avec un actif à oui?

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    te retournera tous les articles actifs qui ne sont pas dans les rayons de classe x, ainsi que ceux qui ne sont carrément pas dans la table rayon du tout. Est-ce bien cela que tu veux?
    oui c'est ça

    Est-ce qu'elle te retourne des résultats? Si oui, est-ce que ces id_article sont présents dans la table article avec un actif à oui?
    oui et oui

    J'ai du mal à comprendre, j'ai vraiment l'impression qu'il ne comprend pas le NOT IN et je confirme que les 2 requêtes suivantes donnent le même résultat :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT id_article, nom_article
    	  FROM articles
    	  WHERE actif_article = "oui"
              AND id_article NOT IN (SELECT id_article FROM rayon WHERE classe = "x")
     
    SELECT id_article, nom_article
    	  FROM articles
    	  WHERE actif_article = "oui"

    Et ce n'est clairement pas possible...


  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    496
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 496
    Points : 585
    Points
    585
    Par défaut
    J'ai fait une recherche dans google sur "mysql not in" et apparemment la syntaxe NOT IN ne fonctionne pas qd tu utilises une sous-requête (elle a en tout cas une limite au niveau du nbre d'enregistrements), essaie plutôt une jointure externe :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT A.id_article, A.nom_article
    FROM articles A
    LEFT JOIN rayon R ON R.id_article = A.id_article
    WHERE A.actif_article = "oui" AND R.classe <> "x"

    Je pense que celle-ci devrait marcher, et si tu veux plus d'infos je te conseille de faire la recherche dans google, il y a pas mal de forums qui en parlent, dont celui-ci

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    J'ai déjà essayé les jointures externes

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT A.id_article, A.nom_article
    FROM articles A
    LEFT JOIN rayon R ON R.id_article = A.id_article
    WHERE A.actif_article = "oui" AND R.classe <> "x"

    Cette requête me donne tous les articles qui sont dans les autres classes, y compris les articles qui peuvent être dans la classe x et la classe y par exemple (et comme tous les articles peuvent avoir plusieurs classes).
    Je cherche à obtenir tous les articles qui ne sont pas affectés à la classe x uniquement.

    J'ai essayé ça, mais pas plus de résultat

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT A.id_article, A.nom_article
    FROM articles A
    LEFT JOIN rayon R ON R.id_article = A.id_article
    WHERE A.actif_article = "oui" AND R.classe <> "x"
    AND R.classe IS NULL

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    496
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2004
    Messages : 496
    Points : 585
    Points
    585
    Par défaut
    Dans ce que j'avais lu il y avait une dernière possibilité avec le NOT EXISTS, j'ai pas testé mais ça devrait donner quelque chose comme ça :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT id_article, nom_article
    FROM articles 
    WHERE actif_article = "oui" AND NOT EXISTS (SELECT id_article FROM rayon WHERE classe = "x")

  11. #11
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    25
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2008
    Messages : 25
    Points : 18
    Points
    18
    Par défaut
    oui j'avais déjà essayé avec un NO EXISTS (j'en parle dans mon 1er post)

    Du coup je vais utiliser un array_diff, j'aurai préféré en une seule requête mais tant pis

    Merci beaucoup pour votre aide, surtout toi Billoum

Discussions similaires

  1. trier une table en fonction d'une autre
    Par boss_gama dans le forum Langage SQL
    Réponses: 7
    Dernier message: 18/10/2009, 12h17
  2. Afficher une table en fonction d'une autre
    Par buzz68180 dans le forum WinDev
    Réponses: 7
    Dernier message: 25/05/2009, 12h21
  3. Réponses: 2
    Dernier message: 20/12/2008, 08h51
  4. Réponses: 2
    Dernier message: 11/09/2007, 12h15
  5. Mise a jour d'une table en fonction d'une base distante
    Par Thor Tillas dans le forum Access
    Réponses: 1
    Dernier message: 11/01/2007, 10h27

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