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

Sélectionner tous les champs dans une requete sans les citer [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 20-01-2015 à 21:34:32    

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
Reply

Marsh Posté le 20-01-2015 à 21:34:32   

Reply

Marsh Posté le 20-01-2015 à 21:58:07    

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
Reply

Marsh Posté le 20-01-2015 à 22:03:10    

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
 

Reply

Marsh Posté le 20-01-2015 à 22:12:13    

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
Reply

Marsh Posté le 20-01-2015 à 23:42:17    

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
Reply

Marsh Posté le 21-01-2015 à 09:24:54    

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
Reply

Marsh Posté le 21-01-2015 à 10:09:38    

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
Reply

Marsh Posté le 21-01-2015 à 10:56:59    

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
Reply

Marsh Posté le 21-01-2015 à 10:59:09    

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
Reply

Marsh Posté le 21-01-2015 à 12:26:08    

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
Reply

Marsh Posté le 21-01-2015 à 12:26:08   

Reply

Marsh Posté le 21-01-2015 à 13:41:57    

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

Reply

Marsh Posté le 21-01-2015 à 14:20:09    

"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
Reply

Marsh Posté le 21-01-2015 à 16:23:20    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed