Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2024 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] Sélectionner tous les champs dans une requete sans les citer

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[SQL] Sélectionner tous les champs dans une requete sans les citer

n°2248884
tomware
Moteur à eau
Posté le 20-01-2015 à 21:34:32  profilanswer
 

Bonjour,
 
Mon titre n'est pas très explicite...  
 
J'ai une table "particularite" qui se compose de la sorte :
id | id_membre | barbu | sophistiqué | mignon | timide | badboy
1 | 203 | 0 | 1 | 3 | 0 | 0
 
Je voudrais construire une requête affichant uniquement les particularités qui sont différents de 0. Certaines particularités sont des sous-particularités (et donc peuvent être numérotées de 1 a 10).
En meme temps des champs seront ajoutés dans le futur depuis phpmyadmin... Donc déjà est il possible d'afficher des champs sans connaitre leurs noms ? (dans la mesure où ils ne seront jamais écris dans la requete sql)
 
Ainsi sur ma page je voudrais arriver à afficher :
Fiche membre 203
Sophistiqué (1)
Mignon (3)
 
Et pas le reste, vu qu'ils sont à zéro.
 
Je cherche ainsi à afficher le nom des colonnes d'une table avec leur valeur, et uniquement les champs dont la valeur est différente de zéro ;)
 
Si quelqu'un a des pistes de réfléxion merci par avance  :hello:

Message cité 1 fois
Message édité par tomware le 20-01-2015 à 21:52:04
mood
Publicité
Posté le 20-01-2015 à 21:34:32  profilanswer
 

n°2248889
tomware
Moteur à eau
Posté le 20-01-2015 à 21:58:07  profilanswer
 

Premier avancement. J'arrive a afficher la liste des champs.
 

Citation :

$req = "SHOW COLUMNS FROM particularite";
 
$result = mysql_query($req) or die("<u>Erreur</u> : <br /> ".$req." : <br />".mysql_error());
while ($row = mysql_fetch_array($result))
{
$monchamp = $row["Field"];
echo $monchamp."<br />\n";
}


 
Je n'ai plus qu'a trouver comment extraire uniquement les champs contenant une valeur > 0, ET afficher la valeur du champ en question...
 
Edit : Ah ben en fait elle m'avance a rien cette requete vis a vis de mon membre "203"  :D


Message édité par tomware le 20-01-2015 à 22:14:44
n°2248890
olivthill
Posté le 20-01-2015 à 22:03:10  profilanswer
 

tomware a écrit :

est il possible d'afficher des champs sans connaitre leurs noms ? (dans la mesure où ils ne seront jamais écris dans la requete sql)


Oui :

Select *


 
A part ça, pourquoi refuser d'écrire le nom des colonnes dans une requête ? Si c'est par paresse, ce n'est pas un bon argument.
 
Si c'est pour éviter d'avoir des champs vide ou à zéro, alors il faudrait faire plusieurs tables au lieu d'une seule.
Par exemple, il y aurait les tables :
 
T_membre avec les colonnes id, et id_membre
 
T particularite avec les colonne id_particularite, libelle_particularite
 
T_membre_particularite avec les colonnes id_membre, id_particularite, valeur_particularite
 

n°2248891
tomware
Moteur à eau
Posté le 20-01-2015 à 22:12:13  profilanswer
 

Merci pour ta réponse Olivthill :)
 

Citation :

A part ça, pourquoi refuser d'écrire le nom des colonnes dans une requête ? Si c'est par paresse, ce n'est pas un bon argument.  


Par précaution, car les particularités ne sont pas encore finies d'être écrites. Il se pourrais que j'en rajoute 10 ou 15 de plus. Et peut etre il y aura 1 ou 2 rajouts par semaine... voir même des suppressions.
 

Citation :

T_membre avec les colonnes id, et id_membre
 
T particularite avec les colonne id_particularite, libelle_particularite
 
T_membre_particularite avec les colonnes id_membre, id_particularite, valeur_particularite


 Je crois que c'est ce que j'ai fait  :jap:  
T_membre avec les colonnes id, et id_membre : OK
T particularite avec les colonne id_particularite, libelle_particularite : OK
T_membre_particularite avec les colonnes id_membre, id_particularite, valeur_particularite : OK
 
J'ai bel et bien cette structure :)

Message cité 1 fois
Message édité par tomware le 20-01-2015 à 22:16:39
n°2248897
tomware
Moteur à eau
Posté le 20-01-2015 à 23:42:17  profilanswer
 

Petite réflexion perso :
- Faire la requete SHOW COLUMNS ( http://forum.hardware.fr/hfr/Progr [...] m#t2248889 )
- Mettre les résultats dans un tableau
 
- Faire une requette SELECT * from particularite WHERE id = "203";
- Mettre les résultats dans un autre tableau
 
Et faire matcher les deux tableaux :  
Requete1[0] = Requete2[0]
Requete1[1] = Requete2[1]
etc...
Ce n'est qu'une réfléxion hein   [:tomware]


Message édité par tomware le 21-01-2015 à 00:09:34
n°2248922
rufo
Pas me confondre avec Lycos!
Posté le 21-01-2015 à 09:24:54  profilanswer
 

tomware a écrit :

Merci pour ta réponse Olivthill :)
 

Citation :

A part ça, pourquoi refuser d'écrire le nom des colonnes dans une requête ? Si c'est par paresse, ce n'est pas un bon argument.  


Par précaution, car les particularités ne sont pas encore finies d'être écrites. Il se pourrais que j'en rajoute 10 ou 15 de plus. Et peut etre il y aura 1 ou 2 rajouts par semaine... voir même des suppressions.
 

Citation :

T_membre avec les colonnes id, et id_membre
 
T particularite avec les colonne id_particularite, libelle_particularite
 
T_membre_particularite avec les colonnes id_membre, id_particularite, valeur_particularite


 Je crois que c'est ce que j'ai fait  :jap:  
T_membre avec les colonnes id, et id_membre : OK
T particularite avec les colonne id_particularite, libelle_particularite : OK
T_membre_particularite avec les colonnes id_membre, id_particularite, valeur_particularite : OK
 
J'ai bel et bien cette structure :)


Dans ton premier post, on a plutôt l'impression que t'as qu'une seule table. olivthill te propose de sortir les champs "barbu", "sophistiqué" et autres particularités de la table et de faire :
- une autre table ayant la structure Id_particularité, Libelle_particularité
- une autre table permettant de lier un membre à une ou plusieurs particularités (avec, pour chaque lien, la valeur de 1 à 10). Comme ça, plus de valeur 0.
 
Bref, tu passerais de 1 table à 3 tables... Du coup, si t'as besoin de rajouter une particularité, c'est juste un simple enregistrement en plus dans la table T particularite (le libellé de la particularité) puis, dans T_membre_particularite, des enregistrements en plus pour lier des membres à cette nouvelle particularité. Du coup, tu résouts tous tes pbs ;)


Message édité par rufo le 21-01-2015 à 09:26:46

---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2248929
tomware
Moteur à eau
Posté le 21-01-2015 à 10:09:38  profilanswer
 

Oui dans le premier post je faisais justement référence a la table  
T_membre_particularite avec les colonnes id_membre, id_particularite, valeur_particularite ;)
En fait c'est la requete que je cherche pour afficher ces données.  
Donc sans avoir a énumérer le nom de tous les champs dedans... car elles ne seront jamais définitives (donc ne pas a voir a modifier la requete a chaque fois)


Message édité par tomware le 21-01-2015 à 10:10:24
n°2248938
rufo
Pas me confondre avec Lycos!
Posté le 21-01-2015 à 10:56:59  profilanswer
 

Je comprends pas : si t'as la structure proposé par olivthill, comment peux-tu avoir la mise en forme proposée dans ton premier post :??:
 
Si c'était le cas, t'aura ça comme résultat :
id_membre | id_particularité | libelle_particularite | valeur
    203      |            2        |       sophistiqué     |    1
    203      |            3        |       mignon           |    3
    204      |            1        |       barbu             |    2
 
Du coup, si tu rajoutes une particularité, ça modifiera le contenu de tes tables mais pas leur structure ni les requêtes. Du coup, je comprends pas ton précédent post :/


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2248939
mechkurt
Posté le 21-01-2015 à 10:59:09  profilanswer
 

Relit lentement ce que les gens te disent :
 - Ce que tu demandes n'est pas possible en SQL pur avec une seul table (en tout cas à ma connaissance, y'a ptet moyen avec une procédure mais c'est overkill pour ton pb)
 - Soit tu récupérés tout avec étoile et c'est en traitement derrière (PHP ou autre) que tu affiches ou pas tes champs (avec un foreach (row as key => value) { if (value > 0) { echo key / value } }
 - Soit tu fait plusieurs tables :
. une table membres avec id_membre / nom_membre
. une table particularités avec id_particularite / nom_particularite
. une table membres_particularites avec id_membre / id_particularite / valeur
  Tu pourras ensuite récupéré ta fiche membre avec une jointure entre tes 3 tables


---------------
D3
n°2248951
tomware
Moteur à eau
Posté le 21-01-2015 à 12:26:08  profilanswer
 

Bonjour à tous  :hello:  

rufo a écrit :

Je comprends pas : si t'as la structure proposé par olivthill, comment peux-tu avoir la mise en forme proposée dans ton premier post :??:
 
Si c'était le cas, t'aura ça comme résultat :
id_membre | id_particularité | libelle_particularite | valeur
    203      |            2        |       sophistiqué     |    1
    203      |            3        |       mignon           |    3
    204      |            1        |       barbu             |    2
 
Du coup, si tu rajoutes une particularité, ça modifiera le contenu de tes tables mais pas leur structure ni les requêtes. Du coup, je comprends pas ton précédent post :/


 
Voici le détail de mes 3 tables :
id_membre
id     | id_look  |  age
203  |     65    |   20
look
id | id_membre | id_cheveux | id_particularite | id_yeux
65  | 203          |       4        |    2                | 3
une table cheveux, une table particularite, une table yeux.... voici la table paticularite
id | libelle_particulaire  
1  | sophistiqué
2  | mignon
3  | barbu
 

mechkurt a écrit :


  Tu pourras ensuite récupéré ta fiche membre avec une jointure entre tes 3 tables


Justement, par rapport a ma question de base, il me faut le nom des champs ;) Et ces noms je ne veux pas les écrire manuellement :)
Après il est clair que je n'ai pas le niveau  [:noz_]  
 
=================================================================================================
J'ai un peu avancé dans mon probleme :
Dans un premier temps, je cherche deja a pouvoir afficher les résultats en récupérant le nom des champs via une requete.

Citation :

<?php
 
// Une premiere requete pour stocker le nom des champs dans un tableau
$req  = "SHOW COLUMNS FROM id_look  ";
$result = mysql_query($req) or die("<u>Erreur</u> : <br /> ".$req." : <br />".mysql_error());
$resultats = array(); // On crée le tableau.
     
    while($r = mysql_fetch_array($result))
    {
        $resultats[] = $r; // On le rempli avec les résultats.
    }
     
    for($i = 0; $i < 10; $i++) // le inférieur à 10 c'est juste pour les tests.
    {
       
            echo $resultats[$i]['Field'].'<br/>'; // On affiche une colonne de cette ligne.
       
    }
 
//  Une deuxieme requete pour afficher les resultats d'une ligne selon l'id du membre
 $sql = 'SELECT * FROM id_look WHERE id="203"';
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
 $banane = array(); // On crée le tableau.
 
    while($res = mysql_fetch_array($req))
    {
        $banane[] = $res; // On le rempli avec les résultats.
    }
 
     
    for($i = 0; $i < 10; $i++)  // le inférieur à 10 c'est juste pour les tests.
    {
 echo " (".$resultats[$i]['Field']." ) : ".$banane[$i][$resultats[$i]['Field']]."      (i = $i)<br/>";
    }        
 
?>


 
Ce qui affiche :

Citation :

(id) : 203 (i = 0) youpi ca fonctionne ! :bounce:  
(id_photo) : (i = 1) Mais heu...  :sweat:  où sont les autres résultats  :sweat: ... pourquoi vide alors que i s'affiche, et le field aussi...
(id_cheveux_couleur) : (i = 2)
(id_yeux_couleur) : (i = 3)
(id_particularite) : (i = 4)
(id_corpulence) : (i = 5)
(id_gouts) : (i = 6)
(id_vetements) : (i = 7)
(id_passion) : (i = 8)
() : (i = 9) // logique pour le moment je n'ai que 8 champs dans ma table


Message édité par tomware le 21-01-2015 à 12:41:46
mood
Publicité
Posté le 21-01-2015 à 12:26:08  profilanswer
 

n°2248963
tomware
Moteur à eau
Posté le 21-01-2015 à 13:41:57  profilanswer
 

Ca y est ca marche. Toujours la meme logique du dessus, mais corrigé.
 

Citation :

$sql = 'SELECT * FROM id_look WHERE id="203"';
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
 $banane = array(); // On crée le tableau.
 
    while($res = mysql_fetch_array($req))
    {
        $banane[] = $res; // On le rempli avec les résultats.
 
    }
 
     
    for($i = 0; $i < 10; $i++) // On liste 10 résultats à partir du 5eme (les tableaux commencent à l'index 0).
    {
 $ouache = $resultats[$i][Field]; // pour pas foirer ma concaténation
echo $banane[0][$ouache].'<br/>';  
 
}


 
 
Ce qui m'affiche :
203
2
3
5
...
 
OK, prochaine étape, je vais faire une jointure

n°2248973
rufo
Pas me confondre avec Lycos!
Posté le 21-01-2015 à 14:20:09  profilanswer
 

"une table cheveux, une table particularite, une table yeux.... voici la table paticularite "
-> Mauvaise idée
Si la liste de ces tables décrivant l'aspect d'un membre est fini (ie, tu ne rajoutera jamais de table), alors tu peux rester sur une seule table pour gérer le tout.
T_Caracteristiques a la structure suivante :
Id_caractéristique
Libelle_caracteristique
Type_Caracteristique  -> un enum (ou un entier) prenant une valeur parmi la liste suivante : "cheveux", "particularité", "yeux"...
Valeur_caracteristique
id_membre   -> clé étrangère provenant de la table T_membres (au demeurant, ton choix de nommer une table id_membre est pas top :/ )
La requête suivante te permettra de récupérer toutes les infos d'un membre

Code :
  1. SELECT m.id, m.age, c.Id_caractéristique, c.Libelle_caracteristique, c.Type_Caracteristique, c.Valeur_caracterisique
  2. FROM T_Membres m INNER JOIN T_Caracteristiques c ON (c.id_membre = m.id_membre)
  3. WHERE m.id_membre = 203
  4. ORDER BY c.Type_Caracteristique


Dans mon cas, la table look ne sert à rien car un membre à 0 ou plusieurs caractéristiques.
 
Si la liste des tables n'est pas finie, alors faut rajouter une table et transformer le champ Type_caracteristique en une clé étrangère id_TypeCaracteristique.
T_Caracteristiques a la structure suivante :
Id_caractéristique
Libelle_caracteristique
Valeur_caracteristique
id_TypeCaracteristique  -> clé étrangère provenant de la table T_TypesCaracteristiques
id_membre -> clé étrangère provenant de la table T_Membres
 
T_TypesCaracteristiques a la structure suivante :
id_TypeCaracteristique
Libelle_TypeCaracteristique
 
Requête :

Code :
  1. SELECT m.id, m.age, c.Id_caractéristique, c.Libelle_caracteristique, tc.id_TypeCaracteristique, tc.Libelle_TypeCaracteristique, c.Valeur_caracterisique
  2. FROM T_Membres m INNER JOIN T_Caracteristiques c ON (c.id_membre = m.id_membre) INNER JOIN T_TypesCaracteristiques tc ON (c.id_TypeCaracteristique = tc.id_TypeCaracteristique)
  3. WHERE m.id_membre = 203
  4. ORDER BY c.Type_Caracteristique


 
C'est bon là ?


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2248985
tomware
Moteur à eau
Posté le 21-01-2015 à 16:23:20  profilanswer
 

Merci pour ta réponse rufo.
Vu mon faible niveau, je prends le temps de bien comprendre en relisant et je repasses ;)
:jap:


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [SQL] Sélectionner tous les champs dans une requete sans les citer

 

Sujets relatifs
[réglé] [SQL] Jointure et variable du meme nomRequête SQL jointure deux champs vers un même champ
besion solution Exercice SQLdécimales qui se n'affichent pas SQL Developer
Comment sélectionner une portion de texte grâce au numéro de ligne[POSTGRES SQL] Besoin d'aide
(SQL] AIde pour requète 
Plus de sujets relatifs à : [SQL] Sélectionner tous les champs dans une requete sans les citer


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR