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

Langage SQL Discussion :

[MySQL] : aide à un débutant


Sujet :

Langage SQL

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 830
    Points
    5 830
    Billets dans le blog
    1
    Par défaut [MySQL] : aide à un débutant
    J'espère une aide pour formuler des requêtes SQL. Je commence à apprendre, et j'arrive à faire des choses simples. J'utilise phpmyadmin, ou bien je code tout en PHP.
    Je ne sais pas faire des requêtes un peu complexes ; en fait, j'essaie de faire des exos pris dans un livre. Pour m'aider, je voudrais qu'on m'indique les requêtes suivantes :

    Les tables (les noms parlent d'eux-même) :
    client (id_client, nom, prenom, adresse, ville)
    article (id_article, prix, designation)
    commande (id_comm, id_client)
    ligne (id_comm, id_article, quantite, prixunit)

    Requêtes demandées :
    - Affichez les coordonnées des clients ayant la même adresse (adresse et ville)
    - Sélectionnez les clients dont le montant d'une commande dépasse 1500 euros.

    Mercii d'avance de l'aide ; je crois que la solution m'aidera à progresser.

  2. #2
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 142
    Points : 122
    Points
    122
    Par défaut
    1- Clients ayant la même adresse :

    select id_client, nom, prenom
    from client
    where adresse = adresse_passee_en_variable
    and ville = ville_passee_en_variable


    2- Clients ayant une commande supérieure à 1500 euros

    select sum(T1.quantite*T1.prix_unitaire), T3.nom, T3.prenom,
    T2.id_commande
    from ligne T1, commande T2, client T3
    where T2.id_client = T3.id_client
    and T1.id_commande = T2.id_commande
    group by id_commande, T3.nom
    having sum(T1.quantite*T1.prix_unitaire) > 1500

    A+

  3. #3
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 830
    Points
    5 830
    Billets dans le blog
    1
    Par défaut
    Merci pour ta réponse : les 2 requêtes marchent, mais concernant la 1e, n'y a-t-il pas moyen de lister tous les clients ayant la même adresse et la même ville d'un seul coup (sans préciser de quelle adresse et de quelle ville, il s'agit) ?

  4. #4
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    salut

    pour la 1ere requete, tu peux essayer quelque chose dans ce genre je pense :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select id_client, nom, prenom
    from client a join client b
    on a.adresse = b.adresse
    and a.ville = b.ville
    and a.id_client <> b.id_client
    je n'ai pas testé

  5. #5
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 830
    Points
    5 830
    Billets dans le blog
    1
    Par défaut
    J'ai essayé la requête proposée par cybher, mais si je laisse id_client ds select, il me dit ambiguous field, et si je l'enlève, pour nom et prenom, idem, par contre si je mets a.nom et a.prenom, il me met le warning suivant : Cannot modify header information - headers already sent by (output started at C:\wamp\phpmyadmin\libraries\header_meta_style.inc.php:21) in C:\wamp\phpmyadmin\libraries\common.lib.php on line 1088.
    Ca pose donc tjs pb.

  6. #6
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 142
    Points : 122
    Points
    122
    Par défaut
    Es-tu sûr de ton code ?

    Dans le doute, essaie :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT a.id_client, a.nom, prenom
    FROM client a ,client b
    ON a.adresse = b.adresse
    AND a.ville = b.ville
    AND a.id_client <> b.id_client
    C'est une version plus "archaïque" que celle proposée par Cybher.
    A voir si ta version de base de données accepte la syntaxe JOIN...

    A+

  7. #7
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 142
    Points : 122
    Points
    122
    Par défaut
    Oups... C'est parti un peu vite

    La première ligne est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT a.id_client, a.nom, a.prenom

  8. #8
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 830
    Points
    5 830
    Billets dans le blog
    1
    Par défaut
    J'ai d'abord essayé ta 1e proposition, puis j'ai rajouté le a. devant prenom, sans voir le 2e msg, mais ds les 2 cas, j'ai le msg d'erreur suivant :
    #1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'ON a . adresse = b . adresse AND a . ville = b . ville AND a . id_client <> b ' at line 1
    Sinon, j'étais sûr du code que j'avais essayé.
    Puis, j'ai réessayé ton code en remplaçant ON par WHERE, et j'ai eu le warning suivant :
    Warning: Cannot modify header information - headers already sent by (output started at C:\wamp\phpmyadmin\libraries\header_meta_style.inc.php:21) in C:\wamp\phpmyadmin\libraries\common.lib.php on line 1088

    Merci qd même d'essayer de trouver une solution.

  9. #9
    Membre régulier

    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    142
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 142
    Points : 122
    Points
    122
    Par défaut
    Pas terrible ce que j'ai écrit...

    Essaie ça :

    SELECT a.id_client, a.nom, a.prenom
    FROM client a ,client b
    WHERE a.adresse = b.adresse
    AND a.ville = b.ville
    AND a.id_client <> b.id_client

    ON est inséparable de JOIN et permet de définir le critère de jointure.

    Dans la syntaxe que je te propose, et qui n'utilise pas le JOIN, le critère de jointure est déterminé par l'ensemble de la clause WHERE.

    Désolé !

    A+

  10. #10
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 830
    Points
    5 830
    Billets dans le blog
    1
    Par défaut
    J'ai fait l'essai (d'ailleurs, je crois que je l'avais déjà fait hier soir, en remplaçant le ON par WHERE), mais j'ai le warning suivant :
    Warning: Cannot modify header information - headers already sent by (output started at C:\wamp\phpmyadmin\libraries\header_meta_style.inc.php:21) in C:\wamp\phpmyadmin\libraries\common.lib.php on line 1088
    D'autre part, d'après mon bouquin, les jointures concernent des tables différentes, alors que là, il n'y a qu'une seule table...

  11. #11
    Expert confirmé Avatar de Cybher
    Homme Profil pro
    Consultant réseaux et sécurité
    Inscrit en
    Mai 2005
    Messages
    3 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Consultant réseaux et sécurité
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 281
    Points : 4 644
    Points
    4 644
    Par défaut
    c'est ce qu'on apelle une auto jointure
    http://sql.developpez.com/sqlaz/jointures/#L3.3

    qu'utilise tu comme version de MySQL?

  12. #12
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 830
    Points
    5 830
    Billets dans le blog
    1
    Par défaut
    Ma version de MySQL est la 5.0.22

  13. #13
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 830
    Points
    5 830
    Billets dans le blog
    1
    Par défaut
    J'ai réussi à faire ce qui était demandé en ayant recours à PHP :

    include_once('connex.inc.php');
    //Requète SQL
    $requete="SELECT adresse,ville FROM client ";
    $idcom=connex('magasin','myparam'); // connexion à la base magasin
    $result=@mysql_query($requete,$idcom);

    while($ligne=mysql_fetch_array($result,MYSQL_NUM))
    {
    $ligne[0]=mysql_escape_string($ligne[0]);
    $ligne[1]=mysql_escape_string($ligne[1]);
    $requet="select id_client, nom, prenom from client
    where adresse = '$ligne[0]' and ville = '$ligne[1]'";
    $resultat=@mysql_query($requet,$idcom);
    if (mysql_num_rows($resultat) > 1) {
    echo "<table border=\"1\">";
    echo "<th>id_client</th> <th>nom</th> <th>prenom</th>";
    while($ligne=mysql_fetch_array($resultat,MYSQL_NUM))
    {
    echo "<tr>";
    foreach($ligne as $valeur)
    {
    echo "<td> $valeur </td>";
    }
    echo "</tr>";
    }
    echo "</table>"; }
    }
    Mais ça serait qd même plus propre (et sûrement plus simple) de le faire en SQL pur.

  14. #14
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 470
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 470
    Points : 5 830
    Points
    5 830
    Billets dans le blog
    1
    Par défaut
    Y a-t-il une solution en SQL pur (j'imagine que oui) ?

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

Discussions similaires

  1. [MySQL] Aide pour une requête
    Par Rototo001 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 06/02/2007, 10h57
  2. [MySQL] Aide pour alleger une requete
    Par toniox dans le forum Langage SQL
    Réponses: 6
    Dernier message: 10/07/2006, 17h12
  3. Extraction mysql - Aide
    Par facilitant dans le forum Requêtes
    Réponses: 1
    Dernier message: 04/04/2006, 18h12
  4. [MySQL] aide sur une requete
    Par dj-julio dans le forum Langage SQL
    Réponses: 5
    Dernier message: 12/01/2006, 14h25
  5. [MySQL] Aide à la création d'une requête
    Par tom06440 dans le forum Requêtes
    Réponses: 6
    Dernier message: 19/10/2005, 22h05

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