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 :

Recherche multi tables


Sujet :

Requêtes MySQL

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Points : 4
    Points
    4
    Par défaut Recherche multi tables
    Je suis en PHP5 et MySQL5, sur un pack Web Pro+ chez AMEN.
    Je ne suis pas sur d'avoir utilisé la bonne rubrique pour ma demande.

    Je développe une base de données haut-parleurs.
    Un certain nombre de choses fonctionnent, mais il y a un point que je n'arrive pas à régler, et pour lequel je souhaite être aidé.

    Un des critères de recherche d'un HP est le diamètre extérieur. C'est un paramètre commercial qui n'est pas mémorisé.
    Le critère fonctionnel est la surface utile de la membrane qui est mémorisé.
    L'idée, lors d'une recherche des HP d'un diamètre donné, est de lire la surface, puis avec cette surface de lire la correspondance du diamètre, enfin avec le diamètre de n'afficher que les HP qui correspondent a celui demandé.

    Une table contient les correspondances diamètre / surface.
    http://www.petoindominique.fr/php/mysql_diamhp1.php

    Lorsque je n'ai qu'un seul HP il est facile de trouver a correspondance :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      $sql = "SELECT diametre
      FROM taille_hp
      WHERE smin < '$sd' and smax > '$sd'" ;
      $resultat = mysql_query($sql) ;
      while (list($diametre1) = @mysql_fetch_array($resultat))
      {$diametre2 = $diametre1 ;}
    Cette routine fonctionne très bien.

    Comment inclure cette routine dans une recherche multi HP du type :
    Code : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    // Début de la requette Catalogue
    if ( $fabricant == "" ) 
    {
      if ( $diametre == "Tous" ) 
      {
        if ( $type == "Tous")
        {
          $sql = "SELECT id_ref_hp, marque, adresse, reference, diametre, type, fs, vas, qms, qes
          FROM ref_hp
          INNER JOIN marque_hp ON ref_hp.id_marque = marque_hp.id_marque2
          INNER JOIN taille_hp ON ref_hp.id_taille = taille_hp.id_taille2
          INNER JOIN type_hp ON ref_hp.id_type = type_hp.id_type2
          WHERE reference LIKE '%$ref%'
          ORDER BY diametre, marque, reference ASC"  ;
        }
        else
        {
          $sql = "SELECT id_ref_hp, marque, adresse, reference, diametre, type, fs, vas, qms, qes
          FROM ref_hp
          INNER JOIN marque_hp ON ref_hp.id_marque = marque_hp.id_marque2
          INNER JOIN taille_hp ON ref_hp.id_taille = taille_hp.id_taille2
          INNER JOIN type_hp ON ref_hp.id_type = type_hp.id_type2
          WHERE type = '$type' AND reference LIKE '%$ref%'
          ORDER BY diametre, marque, reference ASC" ;
        }
      }
      else 
      {
         if ( $type == "Tous")
        {
          $sql = "SELECT id_ref_hp, marque, adresse, reference, diametre, type, fs, vas, qms, qes
          FROM ref_hp
          INNER JOIN marque_hp ON ref_hp.id_marque = marque_hp.id_marque2
          INNER JOIN taille_hp ON ref_hp.id_taille = taille_hp.id_taille2
          INNER JOIN type_hp ON ref_hp.id_type = type_hp.id_type2
          WHERE diametre = '$diametre' AND reference LIKE '%$ref%'
          ORDER BY diametre, marque, reference ASC" ;
        }
        else
        {
          $sql = "SELECT id_ref_hp, marque, adresse, reference, diametre, type, fs, vas, qms, qes
          FROM ref_hp
          INNER JOIN marque_hp ON ref_hp.id_marque = marque_hp.id_marque2
          INNER JOIN taille_hp ON ref_hp.id_taille = taille_hp.id_taille2
          INNER JOIN type_hp ON ref_hp.id_type = type_hp.id_type2
          WHERE diametre = '$diametre' AND type = '$type' AND reference LIKE '%$ref%'
          ORDER BY diametre, marque, reference ASC" ;
        }
      }
    $fabricant = "Tous" ;
    }
    else
    {
      if ( $diametre == "Tous" ) 
      {
        if ( $type == "Tous")
        {
          $sql = "SELECT id_ref_hp, marque, adresse, reference, diametre, type, fs, vas, qms, qes
          FROM ref_hp
          INNER JOIN marque_hp ON ref_hp.id_marque = marque_hp.id_marque2
          INNER JOIN taille_hp ON ref_hp.id_taille = taille_hp.id_taille2
          INNER JOIN type_hp ON ref_hp.id_type = type_hp.id_type2
          WHERE id_marque2 ='$fabricant' AND reference LIKE '%$ref%'
          ORDER BY diametre, marque, reference ASC" ;
        }
        else
        {
          $sql = "SELECT id_ref_hp, marque, adresse, reference, diametre, type, fs, vas, qms, qes
          FROM ref_hp
          INNER JOIN marque_hp ON ref_hp.id_marque = marque_hp.id_marque2
          INNER JOIN taille_hp ON ref_hp.id_taille = taille_hp.id_taille2
          INNER JOIN type_hp ON ref_hp.id_type = type_hp.id_type2
          WHERE type = '$type' AND id_marque2 ='$fabricant' AND reference LIKE '%$ref%'
          ORDER BY diametre, marque, reference ASC" ;
        }
      }
      else 
      {
         if ( $type == "Tous")
        {
          $sql = "SELECT id_ref_hp, marque, adresse, reference, diametre, type, fs, vas, qms, qes
          FROM ref_hp
          INNER JOIN marque_hp ON ref_hp.id_marque = marque_hp.id_marque2
          INNER JOIN taille_hp ON ref_hp.id_taille = taille_hp.id_taille2
          INNER JOIN type_hp ON ref_hp.id_type = type_hp.id_type2
          WHERE diametre = '$diametre' AND id_marque2 ='$fabricant' AND reference LIKE '%$ref%'
          ORDER BY diametre, marque, reference ASC" ;
        }
        else
        {
          $sql = "SELECT id_ref_hp, marque, adresse, reference, diametre, type, fs, vas, qms, qes
          FROM ref_hp
          INNER JOIN marque_hp ON ref_hp.id_marque = marque_hp.id_marque2
          INNER JOIN taille_hp ON ref_hp.id_taille = taille_hp.id_taille2
          INNER JOIN type_hp ON ref_hp.id_type = type_hp.id_type2
          WHERE diametre = '$diametre' AND type = '$type' AND id_marque2 ='$fabricant' AND reference LIKE '%$ref%'
          ORDER BY diametre ASC, marque ASC, reference ASC" ;
        }
      }
    }
     
    $resultat = mysql_query($sql) ;
     
    // Nombre de réponse
    $nb = @mysql_num_rows($resultat) ;
    echo "<blockquote>" ;
    echo "<blockquote>" ;
    echo "<p><font face=\"Arial\" size=\"2\">Réponses sur la Marque : <b>$fabricant</b>.<br>
                                             Réponse sur la Référence contient : <b>$ref</b>.<br>
    										 Réponses sur le Diamètre calculé : <b>$diametre</b> cm.<br>
    										 Réponses sur le Type : <b>$type</b>.<br>
    										 Classement par Diamètre, Marque et Référence.<br>
    										 <b>$nb</b> réponses dans la table : HP, de la base de données.
    	    </font></p>" ;
    Comme je n'y arrivais pas, j'ai ajouté une colonne diamètre dans la table principale.
    Ainsi l'application fonctionne, mais ne permet pas un ajustement des seuils surface / diamètre en fonction de critères tel que la moyenne ou l'écart type.
    http://www.petoindominique.fr/php/mysql_listehp1.php

    Merci à ceux qui pourront m'aider.

    Dominique PETOIN

  2. #2
    Invité
    Invité(e)
    Par défaut
    Je confirme, il faut le poster dans le forum Mysql.
    Je déplace le message.

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Bonjour,

    Merci d'utiliser les balises [code], c'est quand même plus lisible.
    Personnellement, j'écrirais le code comme suit :
    • la 1ère requête :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
       
      <?php
        $sql = 'SELECT diametre
                FROM taille_hp
                WHERE ' . $sd . ' BETWEEN smin AND smax';
        $resultat = mysql_query($sql) ;
      ?>
    • le reste du code :
      Code : 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
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      <?php
        $and = '';
        if ( $fabricant != '' )
          $and .= ' AND id_marque2 = \'' . $fabricant . '\'';
        else
          $fabricant = 'Tous' ;  
        if ( $diametre != 'Tous' )
          $and .= ' AND diametre = \'' . $diametre . '\'';
        if ( $type != 'Tous')
          $and .= ' AND type = \'' . $type . '\'';
       
        $sql = 'SELECT id_ref_hp, marque, adresse, reference, diametre, type, fs, vas, qms, qes
                FROM ref_hp
                INNER JOIN marque_hp ON ref_hp.id_marque = marque_hp.id_marque2
                INNER JOIN taille_hp ON ref_hp.id_taille = taille_hp.id_taille2
                INNER JOIN type_hp ON ref_hp.id_type = type_hp.id_type2
                WHERE reference LIKE \'%' . $ref . '%\'' . $and . '
                ORDER BY diametre, marque, reference ASC' ;
        $resultat = mysql_query($sql) ;
       
        // Nombre de réponse
        $nb = @mysql_num_rows($resultat) ;
      ?>
      <html>
        <head>
        </head>
        <body>
          <p>
            <font face="Arial" size="2">
              Réponses sur la Marque : <b><?php echo $fabricant; ?></b>.<br>
              Réponse sur la Référence contient : <b><?php echo $ref; ?></b>.<br>
              Réponses sur le Diamètre calculé : <b><?php echo $diametre; ?></b> cm.<br>
              Réponses sur le Type : <b><?php echo $type ?></b>.<br>
              Classement par Diamètre, Marque et Référence.<br>
              <b><?php echo $nb ?></b> réponses dans la table : HP, de la base de données.
            </font>
          </p>
        </body>
      </html>
      C'est plus concis, et donc, plus facile à suivre.


    Mais cela ne répond pas à la question. En effet, les différentes requêtes font toutes appel à une référence. Ce qui correspond obligatoirement à un diamètre.
    A moins de remplacer ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
      WHERE reference LIKE \'%' . $ref . '%\'' . $and . '
    ?>
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <?php
      WHERE ' . $sd . ' BETWEEN smin AND smax' . $and . '
    ?>
    Mais je ne suis pas sûr d'avoir tout compris.

  4. #4
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Je vais commencer des tests ce soir. Il y a des pistes à mettre en application.
    Merci.

    Je ne répondrai sans doute pas avant le 22 pour cause de vacances, mais je reprendrai le sujet et la fin des tests à mon retour.

    dp

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    J'ai mis en place deux choses :
    - La première requette.
    - Votre spectaculaire simplification dans "le reste du code".
    Les deux fonctionnent, merci.

    Il s'agit en fait de deux programmes différents, utilisés a des moments différents.
    Si vous suivez le lien ci-dessous, la sélection d'une liste de HP utilise "le reste du code".
    Si vous choisissez 1 HP en demandant les paramètres T&S, dans le tableau "Référence du haut-parleur" le paramètre "Diamètre calculé" utiise "La première requette".

    Exlications sur "le reste du code" :

    Formulaire : http://www.petoindominique.fr/php/mysql_listehp1.php
    La sélection du haut-parleur doit pouvoir se faire :
    - Par la marque
    - Par quelques lettres de la référence
    - Par le diamètre "commercial"
    - Par le type

    Les paramètres par défaut font que tous les HP sont affichés si rien n'est sélectionné.
    Il faut pouvoir choisir les HP par 1, 2 , 3 ou 4 critères, choisis dans n'importe quel ordre et n'importe quelle combinaison.

    Concernant le diamètre "commercial", j'aimerai intégrer le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE ' . $sd . ' BETWEEN smin AND smax'
    Dans le reste du code, et que cela fonctionne avec les règes ci-dessus.

    J'ai bon espoir d'y arriver avec votre aide, jeca.

    Dominique PETOIN

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Comment ajouter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE ' . $sd . ' BETWEEN smin AND smax' . $and . '
    Dans :

    Code : 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
    18
    19
     
      $and = '';
      IF ( $fabricant != '' )
        $and .= ' AND id_marque2 = \'' . $fabricant . '\'';
      else
        $fabricant = 'Tous' ;  
      IF ( $diametre != 'Tous' )
        $and .= ' AND diametre = \'' . $diametre . '\'';
      IF ( $type != 'Tous')
        $and .= ' AND type = \'' . $type . '\'';
     
      $sql = 'SELECT id_ref_hp, marque, adresse, reference, diametre, type, fs, vas, qms, qes
              FROM ref_hp
              INNER JOIN marque_hp ON ref_hp.id_marque = marque_hp.id_marque2
              INNER JOIN taille_hp ON ref_hp.id_taille = taille_hp.id_taille2
              INNER JOIN type_hp ON ref_hp.id_type = type_hp.id_type2
              WHERE reference LIKE \'%' . $ref . '%\'' . $and . '
              ORDER BY diametre, marque, reference ASC' ;
      $resultat = mysql_query($sql) ;
    En sachant que je veux trouver les HP dont le diamètre répond a la correspondance sd compris entre smin et smax.

    Merci.

    dp

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    D'où sort cette variable '$sd' ?
    Pourquoi ne pas utiliser des noms de variables significatifs permettant à tout un chacun de comprendre de quoi il s'agit ?

    D'autre part, tu devrais demander l'affichage des sources de tes pages dans le navigateur : aucune d'elles ne devrait avoir le logo du W3C, car elles ne sont pas conformes. Il doit y avoir des problèmes de fichiers inclus.

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Sd est un nom significatif !
    C'est la surface du diafragme, de la membrane du HP pour être plus clair.
    C'est a surface active qui pousse l'air pour faire le son.

    Le diamètre du haut-parleur n'est pas significatif acoustiquement parlant.
    Cela inclus le diamètre actif de la membrane, 1/2 suspension extérieure et le saladier qui peut être plus ou moins large.
    Mais c'est un paramètre de choix indispensable.

    C'est pour cela qu'il faut faire une gymnastique avec une table de correspondance surface / diamètre.

    Je continu de faire des tests :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    IF ( $diametre != 'Tous' )
    {
    $and = "diametre = $diametres AND sd BETWEEN smin AND smax" ;
    }
    ELSE
    {
    $and = "\'$sd\' BETWEEN smin AND smax" ;
    }
    $sql = "SELECT id_ref_hp, reference, fs, vas, qms, qes, sd, diametre
    FROM ref_hp, taille_hp
    WHERE $and
    ORDER BY diametre, reference" ;
    Lorsqu'on veut un diamètre précis, cela fonctionne.
    Lorque l'on veut tous les diamètres, je cherche la syntaxe a mettre vers $sd.

    Ensuite, je ferai une intégration globale, ferais sauter la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INNER JOIN taille_hp ON ref_hp.id_taille = taille_hp.id_taille2
    et supprimerai la colonne id_taille dans la table ref_hp

    La colonne id_taille n'a été créé que parce que je ne savais pas faire autrement. C'est un paliatif temporaire qui permet de faire fonctionner l'application de façon transparente pour les utilisateurs.

    dp

  9. #9
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Pour le pékin moyen que je suis, '$surfaceDiaphragme' est beaucoup plus significatif que '$sd'.
    D'autre part, un HP ne peut avoir qu'une seule surface de diaphragme ; pourquoi ne pas avoir stocké celle-ci dans la table des HP, puisque, comme tu le dis, le diamètre commercial est 'subit', alors que le besoin est exprimé par la surface du diaphragme ?
    Pour le reste, je ne comprends pas, car si tu veux tous les diamètres, tu obtiens 'de facto' toutes les surfaces de diaphragme, et '$sd' ne sert à rien, non ?

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    La table ref_hp contient les champs :
    id_ref_hp
    id_marque
    reference
    id_taille (que je veux supprimer, double emploi avec sd)
    id_type
    fs
    vas
    re
    qms
    qes
    sd
    le
    xmax
    datecreate
    datemodif

    la table taille_hp contient les champs :
    id_taille2 qui sera sans doute à supprimer
    diametre
    smin
    smax

    Dans mon fichier test le code ci dessous fonctionne comme je le souhaite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $diametre = "Tous" ;
     
    IF ( $diametre != 'Tous' )
    {$and = "diametre = $diametre AND sd BETWEEN smin AND smax" ;}
    ELSE
    {$and = "sd BETWEEN smin AND smax" ;}
     
    $sql = "SELECT id_ref_hp, reference, fs, vas, qms, qes, sd, diametre
    FROM ref_hp, taille_hp
    WHERE $and
    ORDER BY diametre, sd" ;
    Lorsque je remplace "Tous" dans $diametre par 8 ou 10 ou 13 ou 17, ... J'ai bien le résultat voulu.

    Dans mon fichier d'utilisation, cela ne fonctionne plus.
    J'ai essayé plusieurs choses, et je n'y arrive pas.
    Code : 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
    18
    19
    20
    21
    22
    23
     
    // Début de la requette Catalogue
    $and = '';
      IF ( $fabricant != '' )
        $and .= ' AND id_marque2 = \'' . $fabricant . '\'';
      else
        $fabricant = 'Tous' ;
     
      IF ( $diametre != 'Tous' )
        $and .= ' AND diametre = \'' . $diametre . '\' AND sd BETWEEN smin AND smax' ;
      else
        $and .= ' AND sd BETWEEN smin AND smax' ;
     
      IF ( $type != 'Tous')
        $and .= ' AND type = \'' . $type . '\'';
     
      $sql = 'SELECT id_ref_hp, marque, adresse, reference, diametre, type, fs, vas, qms, qes, xmax, sd
              FROM ref_hp, taille_hp
              INNER JOIN marque_hp ON ref_hp.id_marque = marque_hp.id_marque2
              INNER JOIN type_hp ON ref_hp.id_type = type_hp.id_type2
              WHERE reference LIKE \'%' . $ref . '%\'' . $and . '
              ORDER BY diametre, marque, reference ASC' ;
      $resultat = mysql_query($sql) ;
    Je suis comlètement perdu dans les = , .= , ' , '\' , ect...
    Ou puis-je trouver des explications sur cette syntaxe ?
    Pouvez vous me rétablir le code pour qu'il fonctionne ?

    ------------------------

    Je comprend parfaitement que pour un informaticien surfacediafragme soit plus explicite que sd, mais pour moi qui manipule souvent les paramètres T&S des HP, c'est sd qui est exlicite.
    Dans le même genre : fs, vas, re, qms, qes, sd, le, xmax sont aussi explicites.
    T&S = Paramètres de THIELE et SMALL du nom de leur inventeur.

  11. #11
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    Opérateur .= trouvé dans un livre. (plus les autres du même style)
    Pas besoin d'explications sur ce cas.

    dp

  12. #12
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Essaie avec ça :
    Code : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    <?php
      $where = 'WHERE ';
      $filtre = '';
      if ( $fabricant != '' )
      {
        $filtre .= $where . 'id_marque2 = \'' . $fabricant . '\'';
        $where = ' AND ';
      }
      else
      {
        $fabricant = 'Tous' ;
      }
     
      if ($ref != '')
      {
        $filtre .= $where . 'reference LIKE \'%' . $ref . '%\'';
        $where = ' AND ';
      }
     
      if ( $diametre != 'Tous' )
      {
        $filtre .= $where . 'diametre = ' . $diametre . ' AND sd BETWEEN smin AND smax' ;
        $where = ' AND ';
      }
      else
      {
        $filtre .= $where . 'sd BETWEEN smin AND smax' ;
        $where = ' AND ';
      }
     
      if ( $type != 'Tous')
      {
        $filtre .= $where . 'type = \'' . $type . '\'';
      }
     
      $sql = 'SELECT id_ref_hp, marque, adresse, reference, diametre, type, fs, vas, qms, qes, xmax, sd
              FROM ref_hp, taille_hp
              INNER JOIN marque_hp ON ref_hp.id_marque = marque_hp.id_marque2
              INNER JOIN type_hp ON ref_hp.id_type = type_hp.id_type2 '
              . $filtre . '
              ORDER BY diametre, marque, reference ASC' ;
      echo $sql;
    ?>
    Cela n'exécute pas la requête, mais l'affiche sur l'écran. Vérifie qu'elle correspond à ce que tu as demandé, puis fais un copier-coller dans phpmyadmin ou autre, et exécute là manuellement.

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    J'ai recopier le code dans le fichier test.
    J'ai lancé une requette avec tous les diamètres, marques, types et sans lettre de la référence.
    J'ai récupérer la ligne de requette SQL que j'ai copier directement dans ma base sous phpadmin04-vh

    Erreur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    requête SQL: Documentation
     
    SELECT id_ref_hp, marque, adresse, reference, diametre,
    TYPE , fs, vas, qms, qes, xmax, sd
    FROM ref_hp, taille_hp
    INNER JOIN marque_hp ON ref_hp.id_marque = marque_hp.id_marque2
    INNER JOIN type_hp ON ref_hp.id_type = type_hp.id_type2
    WHERE sd
    BETWEEN smin
    AND smax
    ORDER BY diametre, marque, reference ASC
    LIMIT 0 , 30
    MySQL a réponduocumentation
    #1054 - Unknown column 'ref_hp.id_marque' in 'on clause'

    J'ai refait la même manip avec mon code qui fonctionne, mais sans la recherche du diamètre a partir de Sd.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
     SELECT id_ref_hp, marque, adresse, reference, diametre,
    TYPE , fs, vas, qms, qes, xmax
    FROM ref_hp
    INNER JOIN marque_hp ON ref_hp.id_marque = marque_hp.id_marque2
    INNER JOIN taille_hp ON ref_hp.id_taille = taille_hp.id_taille2
    INNER JOIN type_hp ON ref_hp.id_type = type_hp.id_type2
    WHERE reference LIKE '%%'
    ORDER BY diametre, marque, reference ASC
    LIMIT 0 , 30
    J'ai eu le résultat sur 63 pages...

    Enfin j'ai fait un 3em test avec le code :
    Code : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
     
      $where = 'WHERE ';
      $filtre = '';
      IF ( $fabricant != '' )
      {
        $filtre .= $where . 'id_marque2 = \'' . $fabricant . '\'';
        $where = ' AND ';
      }
      else
      {
        $fabricant = 'Tous' ;
      }
     
      IF ($ref != '')
      {
        $filtre .= $where . 'reference LIKE \'%' . $ref . '%\'';
        $where = ' AND ';
      }
     
      IF ( $diametre != 'Tous' )
      {
        $filtre .= $where . 'diametre = ' . $diametre . ' AND sd BETWEEN smin AND smax' ;
        $where = ' AND ';
      }
      else
      {
        $filtre .= $where . 'sd BETWEEN smin AND smax' ;
        $where = ' AND ';
      }
     
      IF ( $type != 'Tous')
      {
        $filtre .= $where . 'type = \'' . $type . '\'';
      }
     
      $sql = 'SELECT id_ref_hp, reference, diametre, fs, vas, qms, qes, xmax, sd
              FROM ref_hp, taille_hp
              ' . $filtre . '
              ORDER BY diametre, reference ASC' ;
      echo $sql;
    Cela fonctionne sur les diamètres, tous ou choisis, et sur les caractères dans la référence.

    dp

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    11
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 11
    Points : 4
    Points
    4
    Par défaut
    C'est un peu plus compliqué, mais ça marche et c'est en place.
    S'il y a des simplifications, je les testerai.
    Sans simplification, c'est résolu.

    Code : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
     
    // Filtres Caractères dans référence et Diamètre
      $where = 'WHERE ';
      $filtre = '';
     
      IF ($ref != '')
      {
        $filtre .= $where . 'reference LIKE \'%' . $ref . '%\'';
        $where = ' AND ';
      }
     
      IF ( $diametre != 'Tous' )
      {
        $filtre .= $where . 'diametre = ' . $diametre . ' AND sd BETWEEN smin AND smax' ;
        $where = ' AND ';
      }
      else
      {
        $filtre .= $where . 'sd BETWEEN smin AND smax' ;
        $where = ' AND ';
      }
     
    // Début de la requette Catalogue
     
      $i = 1 ;
     
      $sql = 'SELECT id_ref_hp, reference, diametre, fs, vas, qms, qes, sd, xmax
              FROM ref_hp, taille_hp
              ' . $filtre . '
              ' ;
      $resultat = mysql_query($sql) ;
     
    while (list($id_ref_hp1, $reference1, $diametre1, $fs1, $vas1, $qms1, $qes1, $sd1, $xmax1) = @mysql_fetch_array($resultat)) 
    {
      $id_ref_hp2[$i] = $id_ref_hp1 ;
      $reference2[$i] = $reference1 ;
      $diametre2[$i] = $diametre1 ;
      $fs2[$i] = $fs1 ;
      $vas2[$i] = $vas1 ;
      $qms2[$i] = $qms1 ;
      $qes2[$i] = $qes1 ;
      $qts2[$i] = $qms2[$i]*$qes2[$i]/($qms2[$i]+$qes2[$i]) ;
      $sd2[$i] = $sd1 ;
      $xmax2[$i] = $xmax1 ;
      $imax = $i ;
      $i++ ;
    }
     
    // Recherche Marque et type
     
    $i = 1 ;
    while ($i <= $imax) 
    {
          $sql = "SELECT id_ref_hp, marque, adresse, type
          FROM ref_hp
          INNER JOIN marque_hp ON ref_hp.id_marque = marque_hp.id_marque2
          INNER JOIN type_hp ON ref_hp.id_type = type_hp.id_type2
          WHERE id_ref_hp = '$id_ref_hp2[$i]'" ;
     
          $resultat = mysql_query($sql) ;
     
          while (list($id_ref_hp1, $marque1, $adresse1, $type1) = @mysql_fetch_array($resultat)) 
      {
          $id_ref_hp2[$i] = $id_ref_hp1 ;
          $marque2[$i] = $marque1 ;
          $adresse2[$i] = $adresse1 ;
          $type2[$i] = $type1 ;
      }
      $i++ ;
    }
     
    // Création table temporaire
    $sql = "CREATE TEMPORARY TABLE `listehp` (
    `numero` SMALLINT( 4 ) NOT NULL ,
    `marque` VARCHAR( 32 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci ,
    `adresse` VARCHAR( 100 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci ,
    `reference` VARCHAR( 32 ) CHARACTER SET utf8 COLLATE utf8_unicode_ci ,
    `diametre` SMALLINT( 2 ) ,
    `typehp` VARCHAR( 5 ) ,
    `fs` FLOAT ,
    `vas` FLOAT ,
    `qts` FLOAT ,
    `xmax` FLOAT ,
    PRIMARY KEY ( `numero` )
    ) ENGINE = MYISAM ;" ;
    $resultat = mysql_query($sql) ;
     
    // Remplissage table temporaire
    $i = 1 ;
    while ($i <= $imax)
    {
    $sql = "INSERT INTO `listehp` ( `numero` , `marque` , `adresse` , `reference` , `diametre` , `typehp` , `fs` , `vas` , `qts` , `xmax` )
    VALUES (
    '$id_ref_hp2[$i]', '$marque2[$i]', '$adresse2[$i]', '$reference2[$i]', '$diametre2[$i]', '$type2[$i]', '$fs2[$i]', '$vas2[$i]', '$qts2[$i]' , '$xmax2[$i]'
    );" ;
    $resultat = mysql_query($sql) ;
    $i++ ;
    }
     
    // Filtres Fabricant et type
      $where = 'WHERE ';
      $filtre = '';
      IF ( $fabricant != '' )
      {
        $filtre .= $where . 'marque = \'' . $fabricant . '\'';
        $where = ' AND ';
      }
     
        IF ( $type != 'Tous')
      {
        $filtre .= $where . 'typehp = \'' . $type . '\'';
      }
     
    // Recherche finale
      $sql = "SELECT numero, marque, adresse, reference, typehp, diametre, fs, vas, qts, xmax
              FROM listehp
              $filtre
    		  ORDER BY $tri" ;
      $resultat = mysql_query($sql) ;

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 21/05/2012, 11h47
  2. recherche multi tables - SQL
    Par sedou13 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/02/2010, 20h13
  3. Recherche multi table, meme Base
    Par Nako_lito dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 19/06/2008, 11h04
  4. requête recherche multi table avec table "lien"
    Par wulfram dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 10/01/2008, 09h40

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