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

Requêtes MySQL Discussion :

Select avec in ou exists


Sujet :

Requêtes MySQL

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2004
    Messages : 161
    Par défaut Select avec in ou exists
    Bonjour à tous,
    Je travaille avec la version 5 de MySql.

    J'ai une table Rayon avec id_r, nom, place
    Et une table Article avec id_a, id_rayon, reference, prix, quantite

    Je souhaite faire la somme des quantite des articles présents dans les rayons qui abritent un article avec un reference LIKE 'maref%'.
    Je ne sais pas si je suis trop claire là mais je vais essayé de vous montré ce que je souhaite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    nom_rayon      reference    quantite
    ------------  -----------  ---------
    toto           maref1       5
    toto           azerty       12
    toto           querty       6
    J'ai essayé de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT nom, reference, quantite
    FROM Article
    JOIN Rayon ON id_r = id_rayon
    WHERE reference LIKE 'maref%'
    Mais, logique, ça me renvoie que la ligne avec la quantite de maref1

    Alors j'ai essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT nom, reference, quantite
    FROM Article
    JOIN Rayon ON id_r = id_rayon
    WHERE EXISTS (SELECT * FROM Article WHERE reference LIKE 'maref%' )
    Mais ça me renvoie des ligne en plus, des rayons qui n'ont pas d'article qui ont une reference correspondante.

    J'ai essayé un IN au lieu de EXISTS mais ça ne fonctionne pas non plus.

    Quelqu'un pourrait il me dire d'ou vient mon erreur ?
    Merci d'avance à tous !

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    120
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 120
    Par défaut
    Essaye cette syntaxe, je crois bien que c'est ca

    SELECT nom, reference, SUMquantite
    FROM Article
    JOIN Rayon ON id_r = id_rayon
    WHERE reference LIKE 'maref%'
    group by reference

    la fonction SUM ajoutte tes quantité et le group by permet de faire cette somme que sur la référence maref.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 27
    Par défaut
    Ta question est ambigue. Tu écris quelquechose mais ton select (et ton tableau) dit autre chose. Tu veux faire la SOMME des produits de même rayon que maref% ou bien tu veux la LISTE des produits de même rayon que maref%? Dans le premier cas il faut rajouter une fonction SUM avec un GROUP BY.
    Dans les deux cas, il faut d'abord récupérer le nom des rayons qui possèdent maref%

    Pour avoir la liste :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT nom, reference, quantite
    FROM Article
    JOIN Rayon ON id_r = id_rayon
    WHERE id_rayon = (SELECT id_rayon
                               FROM Rayon
                               JOIN Article ON id_rayon = id_r
                               WHERE reference LIKE 'maref%');
    et pour avoir la quantité de chaque produit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT nom, SUM(quantite)
    FROM ....
    ....
                   WHERE reference LIKE 'maref%');
    GROUP BY nom;

    voilà
    Tiens nous au courant ! merci

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2004
    Messages : 161
    Par défaut
    En fait je veux faire la liste des articles qui se trouve dans le même rayon que maref%.
    Je ne pense pas que le = fonctionnera parce que je peux avoir plusieurs résultats. Par exemple dans le rayon toto maref1 et dans le rayon titi maref2.
    Donc dans ce cas, je voudrais savoir quels sont les articles qui se trouvent dans toto et titi.

    Merci en tous cas pour vos réponses. Je vais essayé avec le = quand même !
    Si vous avez d'autres idées, je suis preneuse !

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 27
    Par défaut
    excuse moi, c'est une erreur de ma part... j'ai mis = au lieu de IN ! Mais tu as raison c'est bien IN puisque la sous-requête peut renvoyer plusieurs résultats

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2004
    Messages : 161
    Par défaut
    Oui mais quand je mets in et que je teste ma requete sous mysql, elle mets un temps enorme à s'excecuter et fini par planter...
    D'où mon test avec exists mais ça me renvoi des résultats incorects (par exemple rayon tutu qui ne contient pas d'article en maref%)

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 27
    Par défaut
    Et comme ça? avec un distinct sur les rayons qui possèdent maref... et puis avec des requêtes corrélées sur rayon...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT R.nom, A.reference, A.quantite
    FROM Rayon R INNER JOIN Article A ON R.id_r = A.id_rayon
    WHERE id_rayon IN (SELECT DISTINCT id_r
                               FROM Article A
                               WHERE R.reference LIKE 'maref%');
    tiens moi au courant !

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2004
    Messages : 161
    Par défaut
    J'ai déjà essayé le DISTINCT mais ça mets encore 3 plombe à charger pour finalement ne me donner aucun résultat...

    Mais je croyais que le IN et le EXISTS donnait le même résultat ??

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2004
    Messages : 161
    Par défaut
    Bon, je crois que je vais faire plusieurs requetes, ça sera plus simple à mon avis...
    Merci quand même !

  10. #10
    Membre Expert
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Par défaut
    Bonjour,

    Dans la requête précédente, c'est normal d'avoir un R.reference ???

    La requête suivante est-elle satisfaisante ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT R.nom, A.reference, A.quantite 
      FROM Rayon R 
           INNER JOIN Article A ON (R.id_r = A.id_rayon)
           INNER JOIN Article C USING (id_rayon)
      WHERE C.reference LIKE 'maref%';
    Pour l'optimiser il faut bien entendu un index sur tout les identifiants de rayon, mais également un index sur la colonne reference.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 27
    Par défaut
    euh... encore une erreur de ma part... pas de R.Reference (y'a pas de référence dans le rayon) mais A.Reference... et du coup la corrélation se fait sur Article... mais bon à la réflexion c'est pas une bonne piste.
    Index sur référence, bien sur ! Ca devrait accélérer les choses...
    Pour ce qui est de exist... je ne sais pas... mais cette discussion m'intéresse bien...
    Pourras-tu dire eowene si la solution de Adjanakis fonctionne? (et j'irai voir ce qu'est le USING... je ne connais pas...)

  12. #12
    Membre Expert
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Par défaut
    Je dirai simplement que USING (id_rayon) et l'équivalent de ON (A.id_rayon=C.id_rayon).

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2004
    Messages : 161
    Par défaut
    Je suis désolée, je n'ai pas encore regardé.
    Je le fait tout de suite et je vous tiens au courant.
    Encore merci de votre aide !

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2004
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Février 2004
    Messages : 161
    Par défaut
    A première vue, non, ça ne fonctionne pas non plus, ça me donne tous les rayon même le rayon tutu (qui rappelons le n'a pas d'article en maref!)...
    Donc ça donne la même chose qu'avec EXISTS...

  15. #15
    Membre Expert
    Avatar de Adjanakis
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    739
    Détails du profil
    Informations personnelles :
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations forums :
    Inscription : Avril 2004
    Messages : 739
    Par défaut
    ok, j'apporte une correction, j'avais pas saisi pardon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT R.nom, A.reference, A.quantite 
      FROM Article A
           INNER JOIN Article C USING (id_rayon)
           INNER JOIN Rayon R ON (R.id_r = C.id_rayon)
      WHERE C.reference LIKE 'maref%';
    Ca marche mieux ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 6
    Dernier message: 08/06/2004, 15h51
  2. requete select avec AS remplacement de valeur
    Par pi3141563 dans le forum Requêtes
    Réponses: 3
    Dernier message: 17/04/2004, 23h15
  3. [Eclipe 2.1.1]Projet avec fichiers sources existants
    Par mfofana dans le forum Eclipse Java
    Réponses: 1
    Dernier message: 26/02/2004, 06h20
  4. pb de select avec size avec choix multiple
    Par La_picolle dans le forum ASP
    Réponses: 10
    Dernier message: 28/08/2003, 16h21
  5. requete SELECT avec un nombre constant
    Par gurumeditation dans le forum Requêtes
    Réponses: 3
    Dernier message: 04/07/2003, 21h04

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