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 :

comment utiliser une valeur d'un champs dans un select ?


Sujet :

Requêtes MySQL

  1. #1
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2009
    Messages : 104
    Points : 120
    Points
    120
    Par défaut comment utiliser une valeur d'un champs dans un select ?
    Bonjour à tous,
    je suis nouveau sur ce forum, et fort peu spécialiste en mySQL.
    je cherche depuis quelque temps une réponse, peine perdue, je poste donc.

    Ma question me semble en fait relativement simple :
    Existe-t-il un moyen d'utiliser la valeur d'un champs dans la construction d'un Select (et dans un Join en particulier).
    Mon exemple :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT pr.idproduct, pr.idproducer, pr.idfamily, pr.active, pr.reference, 
    pr.title, pr.description_fr, pr.keyword_fr, pr.type, 
    pr.idsubcaracteristic_1, pr.idsubcaracteristic_2, pr.idsubcaracteristic_15,
    pro.title AS marque,
    fa.listing_caracteristic,
    c.title_fr AS catitle_fr, c.title_en AS catitle_en, c.title_nl AS catitle_nl
    FROM product pr
    LEFT JOIN family fa ON fa.idfamily = pr.idfamily 
    LEFT JOIN subcaracteristic c ON c.idsubcaracteristic = pr.idsubcaracteristic_[fa.listing_caracteristic]
    LEFT JOIN producer pro ON pro.idproducer = pr.idproducer
    WHERE 1
    sachant que ma question réside exactement ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LEFT JOIN subcaracteristic c ON c.idsubcaracteristic = pr.idsubcaracteristic_[fa.listing_caracteristic]
    le contexte :
    - chaque famille de produit contient un champs spécifique de caractéristique à afficher dans les listings de résultat
    - chaque produit appartient à une et une seule famille.
    - chaque produit contient 1 champs de définition de sous caractéristique par caractéristique
    en pratique :
    Les autos affichent en listing la couleur
    Les avions affichent en listing le nombre de roues
    Les fruits affichent le pourcentage en sucre
    un listing mixte devrait montrer :
    2ch : (auto ? couleur donc !) Vert
    Airbus 125 : (avion ? roues donc !) 5
    BMW 44 : (auto ? couleur donc) rouge
    Boiing 127 : (avion ? roues donc !) 12
    Pomme : (fruit ? sucre donc !) 55 %

    J'espère ne pas poster inutilement ce qui a déjà été discuté ..
    et j'espère surtout avoir été clair !

    Merci pour votre aide
    Pat

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 280
    Points : 11 736
    Points
    11 736
    Par défaut
    Peux-tu expliciter clairement ce que signifie pour toi pr.idsubcaracteristic_[fa.listing_caracteristic] ?
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Saluton,
    Je crois avoir compris qu'il voudrait construire dynamiquement un nom de colonne à partir de la valeur d'une colonne pour chaque ligne pendant l'éxécution de la requête.
    L'idée est amusante mais je crois que c'est impossible à réaliser en SQL.
    Je crois surtout que cela repose sur une erreur de modélisation de la table.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  4. #4
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2009
    Messages : 104
    Points : 120
    Points
    120
    Par défaut
    Bonjour,

    Et merci pour vos réponses :

    pr.idsubcaracteristic_[fa.listing_caracteristic] ?

    oui, c'est cela
    construire dynamiquement un nom de colonne à partir de la valeur d'une colonne pour chaque ligne pendant l'éxécution de la requête
    Ce que je pensais être une solution pour supprimer soit 15 LEFT JOIN soit pour supprimer un SELECT dans un WHILE php sur les résultats.

    Toutes mes excuses, j'ai fait un raccourci mental sur la structure d'une variable en php, faute de savoir comment noter une variable sous Mysql.
    je cherchais bien à monter un genre de CONCAT pour définir le nom du champs.

    Quant à la "modélisation de la table", est-elle tellement différente que si on remplace "pr.idsubcaracteristic_[fa.listing_caracteristic]" par "pr.idsubcaracteristic_1" ou "pr.idsubcaracteristic_15" ?
    J'imagine que la réponse tient à ceci : "comment le serveur va-t-il nommé le nom de cette colonne" et que "idsubcaracteristic entre 1 et 15" n'est pas une bonne réponse sous Mysql.

    c'est donc IMPOSSIBLE !

    C'est fou ce que parler avec des gens intelligents fait naître la lumière !!

    MERCI !
    et douce journée,
    Pat

  5. #5
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Citation Envoyé par cholopat Voir le message
    Quant à la "modélisation de la table", est-elle tellement différente que si on remplace "pr.idsubcaracteristic_[fa.listing_caracteristic]" par "pr.idsubcaracteristic_1" ou "pr.idsubcaracteristic_15" ?
    J'imagine que la réponse tient à ceci : "comment le serveur va-t-il nommé le nom de cette colonne" et que "idsubcaracteristic entre 1 et 15" n'est pas une bonne réponse sous Mysql.
    C'est surtout que les lignes résultant de la requête doivent avoir toutes les mêmes colonnes (en nom et en nombre).
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  6. #6
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2009
    Messages : 104
    Points : 120
    Points
    120
    Par défaut
    C'est surtout que les lignes résultant de la requête doivent avoir toutes les mêmes colonnes (en nom et en nombre).
    Le nombre est le cas
    quant au nom aussi, excepté cette colonne bien entendu (vu qu'elle est dynamique), ce qui est loin d'être un détail.

    une petite question, qui découle de la non solution à mon problème :
    qu'est ce qui est plus performant à priori du point de vue général serveur WEB:
    - une requête plus lourde en SQL
    - un requête par ligne de résultat dans un while php

    merci encore !
    Pat

  7. #7
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Je crois qu'il faudrait réfléchir et clarifier ce problème de modélisation pour envisager d'avoir des tables en formes normales et résoudre le problème par une jointure.
    Mais j'avoue ne pas avoir saisi toutes les subtilités de la problématique.

    Si tu devais t'orienter vers une solution
    un requête par ligne de résultat dans un while php
    et que tu es sous PHP5, je te conseille d'utiliser une requête préparée sous PDO.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 280
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 280
    Points : 11 736
    Points
    11 736
    Par défaut
    Citation Envoyé par cholopat Voir le message
    une petite question, qui découle de la non solution à mon problème :
    qu'est ce qui est plus performant à priori du point de vue général serveur WEB:
    - une requête plus lourde en SQL
    - un requête par ligne de résultat dans un while php
    Sans aucune hésitation, c'est la première solution qu'il faut choisir ! Les SGBDR sont conçus pour être optimisés sur du traitement de données en masse. Autrement dit, faire une requête par ligne, ça revient à avoir une formule 1 et rester bloqué en première.
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  9. #9
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2009
    Messages : 104
    Points : 120
    Points
    120
    Par défaut
    Bonjour encore ,

    si cela peut vous aider à m'aider :

    mais cela sera un mix Mysql php, pardon encore,

    voici d'abord la page appliquée :
    http://www.16escadron.eu/public/list...=up&idfamily=1 (par exemple)
    voici le portion de mon code (PHP based) :
    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
    $recherche='
    SELECT pr.idproduct, pr.idproducer, pr.idfamily, pr.active, pr.reference, 
    pr.title, pr.description_fr, pr.keyword_fr, pr.type, 
    pr.price_sell, pr.price_sell_wvat,
    pr.quantity_min, pr.stockreal, pr.stockvirtual, pr.prodnewpromo, pr.prodeditionsp, 
    pr.idsubcaracteristic_1, pr.idsubcaracteristic_2, pr.idsubcaracteristic_3, pr.idsubcaracteristic_4, pr.idsubcaracteristic_5, 
    pr.idsubcaracteristic_6, pr.idsubcaracteristic_7, pr.idsubcaracteristic_8, pr.idsubcaracteristic_9, pr.idsubcaracteristic_10, 
    pr.idsubcaracteristic_11, pr.idsubcaracteristic_12, pr.idsubcaracteristic_13, pr.idsubcaracteristic_14, pr.idsubcaracteristic_15,
    pro.title AS marque,
    fa.listing_caracteristic,
    c.title_fr AS catitle_fr, c.title_en AS catitle_en, c.title_nl AS catitle_nl
    FROM product pr
    LEFT JOIN family fa ON fa.idfamily = pr.idfamily 
    LEFT JOIN caracteristic c ON c.idcaracteristic = fa.listing_caracteristic
    LEFT JOIN producer pro ON pro.idproducer = pr.idproducer 
    ';
    dans un SELECT

    après cela il ne me reste plus qu'à
    (sachant que $_SESSION['public_txtlang'] est la langue pour les pages publique du visiteur)
    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
    <?php
    while ($row = mysql_fetch_array($detailprodrecom->result)) { 
    	$listing_caracteristic = 'idsubcaracteristic_'.$row['listing_caracteristic'];
    	$listing_caracteristic_id = $row[$listing_caracteristic];
    ?>
    		<td align="center" valign="middle" bgcolor="#<?php echo $listingbkg;?>" class="border_right listing_title_normal">
    			<? 
    				if ($listing_caracteristic_id >= 1) {
    					$detail_sub = new db();
    					$detail_sub -> inline("SELECT title_fr, title_en, title_nl FROM subcaracteristic WHERE idsubcaracteristic = $listing_caracteristic_id");
    					$row_sub = mysql_fetch_array($detail_sub->result) ; 
    					if ($row_sub['title_'.$_SESSION['public_txtlang']] != '') {
    						echo $row['catitle_'.$_SESSION['public_txtlang']].' : '.$row_sub['title_'.$_SESSION['public_txtlang']];
    					}
    				}
    			?>
    		</td>
    <?php 
    	$turn_listing++;
    }
    ?>
    Ce qui finalement me semble facile à normer
    je ne cherche finalement que le champs (langue) en rapport à un champs connu et defini

    si c'est toujours clair

    et comme toujours, merci

  10. #10
    Membre régulier
    Inscrit en
    Juin 2009
    Messages
    104
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Juin 2009
    Messages : 104
    Points : 120
    Points
    120
    Par défaut
    oops pardon,

    j'ai oublié de demander : c'est quoi PDO ?

  11. #11
    Membre expert
    Avatar de Maljuna Kris
    Homme Profil pro
    Retraité
    Inscrit en
    Novembre 2005
    Messages
    2 613
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 72
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 613
    Points : 3 950
    Points
    3 950
    Par défaut
    Citation Envoyé par cholopat Voir le message
    j'ai oublié de demander : c'est quoi PDO ?
    PHP Data Objects, extension d'abstraction des connexions aux SGBD pour PHP5, qui supporte, entre autres, les requêtes préparées et les exceptions.
    Kie lumo eksistas ankaŭ ombro troviĝas. L.L. Zamenhof
    articles : Comment émuler un tableau croisé [quasi] dynamique
    et : Une énigme mathématique résolue avec MySQL
    recommande l'utilisation de PDO (PHP5 Data Objects)

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 22/08/2006, 11h28
  2. Réponses: 12
    Dernier message: 21/08/2006, 16h25
  3. Utiliser une valeur d'un formulaire dans un autre ?
    Par jessy212 dans le forum Access
    Réponses: 3
    Dernier message: 21/08/2006, 13h05
  4. Réponses: 2
    Dernier message: 29/05/2006, 14h02
  5. mettre une valeur a un champs dans un onglet..
    Par Fritzoune dans le forum Access
    Réponses: 2
    Dernier message: 03/03/2006, 14h33

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