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 :

Requête "select" sur deux tables dont une vide


Sujet :

Requêtes MySQL

  1. #1
    Rédacteur

    Avatar de Torgar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2007
    Messages
    2 334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2007
    Messages : 2 334
    Points : 8 040
    Points
    8 040
    Par défaut Requête "select" sur deux tables dont une vide
    Bonjour,

    Je viens vers vous car je n'arrive pas à résoudre un problème de requête SQL.

    Versions serveurs :
    - MySQL : 5.0.22 (client api version)
    - PHP : 5.2.0

    Dans le cadre d'un projet de site e-business, j'ai besoin d'associer un client à une commande (ce qui me parait logique).

    Il se peut que ce client soit déjà enregistré (dans la table `client`) et connecté sur le site. [cas n°1]

    Il est possible aussi, qu'un visiteur fasse une demande de devis et remplisse ses informations personnelles (adresse & Cie), que je sauvegarde dans une table temporaire (`temporaire`). [cas n°2]

    La requête qui ne marche pas, me permet de faire la liste des commandes, suivant leur statut (en attente, accepté et refusé), peu importe qu'il s'agisse d'un client enregistré (cas n°1) ou d'une demande de devis (cas n°2).

    Hors, il est possible qu'il n'y ai pas d'enregistrement dans la table `temporaire`, et je pense que mon problème vienne de là (puisque ma table `temporaire` est actuellement vide pour mes essais).

    Petite précision, je n'ai pas d'erreur à l'exécution, juste un "MySQL n'a retourné aucun enregistrement..."

    Voici ma requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT * FROM cmd_temp, ach_temp, client, temporaire 
    WHERE ach_cmd_id = cmd_id 
    	AND (
    		ach_cli_id = client.user_id 
    		OR ach_cli_id = temporaire.user_id
    	) 
    	AND cmd_status = 1 
    GROUP BY ach_cmd_id 
    ORDER BY cmd_date DESC

    Cordialement,

    Torgar.

  2. #2
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 034
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 034
    Points : 23 779
    Points
    23 779
    Par défaut
    Bonjour,

    Il faut commencer par écrire les jointures selon la norme SQL 2, c'est-à-dire avec la syntaxe INNER JOIN plutôt qu'en séparant les tables par des virgules.
    Une fois que c'est fait, il faut passer par une jointure externe (LEFT JOIN) vers la table `temporaire`.
    Il faut aussi abandonner l'étoile au profit des champs à sélectionner réellement...
    Enfin, à quoi est sensé servir le GROUP BY ?

    Bref, un peu de lecture sur le SQL s'impose : http://sql.developpez.com/

    ced

  3. #3
    Rédacteur

    Avatar de Torgar
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2007
    Messages
    2 334
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2007
    Messages : 2 334
    Points : 8 040
    Points
    8 040
    Par défaut
    Je te remercie pour les conseils. L'étoile n'est présente que pour mes tests, cela évoluera par la suite.

    Si je n'applique pas la norme SQL 2, c'est tout simplement parce qu'elle n'a été que survolée durant ma formation (l'un des plus gros défauts d'ailleurs...) et que je n'ai jamais vraiment pu y consacrer du temps pour son apprentissage.

    Je vais me faire une séance de lecture ce matin et voir ce que cela donne avec cette norme.

    Je donnerai des nouvelles quand j'aurai avancé (au moins d'un pas).

    Encore merci.

    [Edit] C'est bon j'ai réussi à faire ce que je voulais.

    Le GROUP BY sert à regrouper les informations de mes commandes. Etant donné que j'ai X lignes de produits dans la table `ach_temp` pour une seule commande dans la `cmd_temp`, je ne dois afficher qu'une seule ligne pour une seule commande.


    Cordialement,

    Torgar.

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

Discussions similaires

  1. Faire un select test sur deux tables non liées
    Par dev14 dans le forum Requêtes
    Réponses: 4
    Dernier message: 27/01/2014, 12h11
  2. Requête avec select max sur 3 tables
    Par Tintinduweb dans le forum Requêtes
    Réponses: 1
    Dernier message: 16/03/2010, 05h49
  3. select distint() sur deux tables
    Par nimbus_77 dans le forum Requêtes
    Réponses: 2
    Dernier message: 14/06/2008, 11h51
  4. Réponses: 2
    Dernier message: 25/09/2006, 13h04

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