Services : Actualité Emploi Blog Forum Flux
Formation Trafic : Référencement Liens sponsorisés Affiliation Ecommerce Nom de domaine E-réputation Marketing Mobile Black Hat
Formation Technique : Performance Web Html Css Sql Curl Asp Dotnet Php Ajax Wordpress Twitter Google Analytics

Forum Oseox
Oseox

Concatenation champs d'infos en base de données : SQL / PHP

Forum Référencement et Trafic
Nous sommes le Jeu 23 Nov 2017 02:59

Heures au format UTC [ Heure d’été ]




Poster un nouveau sujet Répondre au sujet Aller à la page 1, 2  Suivante
Auteur Message
MessagePosté: Jeu 14 Avr 2011 09:36 
Avatar de l’utilisateur
Bonjour,

je dois faire un peu de php j'ai du mal à me projeter sur le comment de ce que je dois faire. :?
J'ai essayé plein de trucs mais je n'arrive pas à finaliser ce que je voudrais, je me perds dans les foreach. :shock:
J'ai par exemple fais une requete pour avoir les lignes ou le code_ano est renseigné, puis apres j'ai tenté avec grand renfort de foreach, de while et de for, de dire:" pour chaque ligne ayant un code_ano !=" " , tant que le n° de ligne est incrementé de 1 et tant que le code_ano est = " " , alors je concatene ... mais en vain.

Voici ce que j'ai en base:
Code:
CREATE TABLE IF NOT EXISTS `anomalies` (
  `ref` varchar(45) DEFAULT NULL,
  `no_ligne` varchar(45) DEFAULT NULL,
  `code_ano` varchar(45) DEFAULT NULL,
  `text_ano` varchar(45) DEFAULT NULL,
) ENGINE=MyISAM  DEFAULT CHARSET=utf8;

--
-- Contenu de la table `anomalies`
--

INSERT INTO `anomalies` (`ref`, `no_ligne`, `code_ano`, `text_ano`) VALUES
(' 1409',  '  1', 'M2523', 'P.ATTEINTE   76'),

(' 2029', '  1', 'E4001', 'M.EXCESSIVE  ),
(' 2029', '  2', 'E4002', 'M.BLOQUEE  ),

(' 2032', '  1', 'M2405', 'C.EXCESSIVE  ),
(' 2032', '  2', '     ', 'T.CALCULEE:000000002  ),
(' 2032', '  3', '     ', 'SEUIL:000000002   '),

(' 1983', '  1', 'M2412', 'PHASE DESEQUILIBREE         21'),
(' 1983', '  2', '     ', 'GROUPE DE COMPT: 01        '),
(' 1983', '  3', '     ', 'CONSO  20 : 000002415 '),
(' 1983', '  4', '     ', 'CONSO  21 : 000001200 '),
(' 1983', '  5', '     ', 'CONSO  22 : 000002965 '),
(' 1983', '  6', 'M2412', 'PHASE DESEQUILIBREE         22'),
(' 1983', '  7', '     ', 'GROUPE DE COMPT: 01        '),
(' 1983', '  8', '     ', 'CONSO  20 : 000002415 '),
(' 1983', '  9', '     ', 'CONSO  21 : 000001200 '),
(' 1983', ' 10', '     ', 'CONSO  22 : 000002965 '),
(' 1983', ' 11', 'M2408', 'CONSOMMATION FORTE         HCH'),
(' 1983', ' 12', '     ', 'PERIODE DU : 22/09  AU  20/10 '),
(' 1983', ' 13', '     ', 'PS:000000112   COEF:   2,50   '),
(' 1983', ' 14', '     ', 'CONSO REF:000000037      '),
(' 1983', ' 15', '     ', 'CONSO EN COURS:000000097 '),
(' 1983', ' 16', 'M2408', 'CONSOMMATION FORTE         HPH'),
(' 1983', ' 17', '     ', 'PERIODE DU : 22/09  AU  20/10  '),
(' 1983', ' 18', '     ', 'PS:000000112   COEF:   2,50   '),
(' 1983', ' 19', '     ', 'CONSO REF:000000031      '),
(' 1983', ' 20', '     ', 'CONSO EN COURS:000000118 '),
(' 1983', ' 21', 'M2408', 'CONSOMMATION FORTE         P  '),
(' 1983', ' 22', '     ', 'PERIODE DU : 22/09  AU  20/10  '),
(' 1983', ' 23', '     ', 'PS:000000112   COEF:   2,50   '),
(' 1983', ' 24', '     ', 'CONSO REF:000000010      '),
(' 1983', ' 25', '     ', 'CONSO EN COURS:000000043 '),
(' 1983', ' 26', 'A2411', 'ECART PRECISION   '),
(' 1983', ' 27', '     ', 'CONSO TOTALE :000006580  '),
(' 1983', ' 28', '     ', 'CONSO REPART:000008020   '),
(' 1983', ' 29', '     ', 'ECART:    1,10                ');



En gros pour une meme reference (colonne "ref" dans la table) j'ai des anomalies (code_ano) et des descriptions pour ces anomalies ( text_ano).
Mais il peut y avoir plusieurs codes anomalies identiques pour une ref, comme dans l'exemple de la ref 1983, ou une seule ligne ( ref 1409) ou plusieurs (ref 2029)
Le truc c'est qu'il faut, pour eviter une redondance des infos, que je concatene les text_ano par code_ano pour une reference:

Ca donnerait ca:

Code:
INSERT INTO `new_anomalies` (`ref`, `code_ano`, `text_ano`) VALUES
(' 1409',  'M2523', 'P.ATTEINTE   76'),

(' 2029',  'E4001', 'M.EXCESSIVE  ),
(' 2029',  'E4002', 'M.BLOQUEE  ),

(' 2032', 'M2405', 'C.EXCESSIVE -/- T.CALCULEE:000000002 -/- SEUIL:000000002),

(' 1983', 'M2412', 'PHASE DESEQUILIBREE 21: GROUPE DE COMPT: 01 -/- CONSO  20 : 000002415 -/- CONSO  21 : 000001200 -/- CONSO  22 : 000002965'),
(' 1983', 'M2412', 'PHASE DESEQUILIBREE 22: GROUPE DE COMPT: 01 -/- CONSO  20 : 000002415  -/- CONSO  21 : 000001200  -/- CONSO  22 : 000002965'),
(' 1983', 'M2408', 'CONSOMMATION FORTE HCH: PERIODE DU : 22/09  AU  20/10 -/- PS:000000112   COEF:   2,50 -/- CONSO REF:000000037 -/- CONSO EN COURS:00000097'),
(' 1983', 'M2408', 'CONSOMMATION FORTE  HPH: PERIODE DU : 22/09  AU  20/10 -/- PS:000000112   COEF:   2,50 -/- CONSO REF:000000031 -/- CONSO EN COURS:000000118'),
(' 1983', 'M2408', 'CONSOMMATION FORTE P: PERIODE DU : 22/09  AU  20/10  -/- PS:000000112   COEF:   2,50 -/- CONSO REF:000000010 -/- CONSO EN COURS:000000043'),
(' 1983', 'A2411', 'ECART PRECISION:  CONSO TOTALE :000006580 -/- CONSO REPART:000008020 -/- ECART:    1,10');


Merci d'avance ! :D
Daphn !


Haut
 Profil Envoyer un e-mail  
 
MessagePosté: Ven 15 Avr 2011 10:30 
Avatar de l’utilisateur
Salut tout le monde !

bon j'ai galéré et me suis fait un peu aidée, et j'arrive à quelques petits trucs, avec des requêtes et des tableaux.
J'ai pris le parti de gérer ça avec des intervalles ( mes intervalles sont les no_lignes où le code_ano n'est pas vide) pour utiliser le BETWEEN sql.

Ça donne ça.

Code:
<?php

$intervalles =array(array("  1409"
  ,"  1"
),
array (
  " 2029"
,"  1"
),
array (
  " 2029"
,"  2"
),
array (
  " 2032"
,"  1"
),
array (
  " 2032"
,"  2"
),
array (
  " 2032"
,"  3"
),

array (
  " 1983"
,"  1"
),
array (
  " 1983"
,"  6"
),
array (
  " 1983"
," 11"
),
array (
  " 1983"
," 16"
),
array (
  " 1983"
," 21"
),
array (
  " 1983"
," 26"
))
;


$duo_intervalles = array();
foreach ($intervalles as $tab_intervalles)
{
    if (!empty($duo_intervalles[$tab_intervalles[0]])) {
      $duo_intervalles[$tab_intervalles[0]][] = $tab_intervalles[1];
   }
    else {
      $duo_intervalles[$tab_intervalles[0]] = array($tab_intervalles[1]);
   }
}



foreach ($duo_intervalles as $intervalle_min => $intervalle_max)
{
   
    for($i = 0, $nbre=count($intervalle_max)-1 ; $i < $nbre ; $i++)
    {
        $sql = 'SELECT ref, no_ligne, code_ano, text_ano FROM anomalies  WHERE ref = '.$intervalle_min.'  AND (no_ligne = '.$intervalle_max[$i].' OR no_ligne BETWEEN '.$intervalle_max[$i].' AND '.$intervalle_max[$i+1].'-1);';
        $req=mysql_query($sql);
      
    }
}


?>


Par contre je n'avais pas pensé à un truc, en vrai tête en l'air que je suis, c'est que je n'ai pas mon "dernier" intervalle maximum.
Mais je le recupere en faisant un Select MAX(no_ligne) as maxi.
Et si j'ai découvert ( chuis trop forte, mais moins que la doc php ! :lol: ) qu'avec array_push je peux le mettre dans mon tableau d'intervalles, je n'arrive pas à trouver "quand" le mettre dans mes boucles :cry: .

Une idée, une fois que j'aurai mes résultats de requête, pour "concaténer" les champs comme dans la table ci-dessus ?
je sèche un peu pour cette suite... :oops:

Merki !

Daphn


Haut
 Profil Envoyer un e-mail  
 
MessagePosté: Ven 15 Avr 2011 13:59 
Avatar de l’utilisateur
Bouhh :cry: ...

j'y arrive pô ! suis paumée...
Personne pour me guider ?

merci d'avance...

Daphn


Haut
 Profil Envoyer un e-mail  
 
MessagePosté: Ven 15 Avr 2011 15:15 
Administrateur
Avatar de l’utilisateur
Je regarde ce week end :)


Haut
 Profil Envoyer un e-mail  
 
MessagePosté: Ven 15 Avr 2011 15:21 
Avatar de l’utilisateur
Moi aussi je sens que je vais potasser ça durant mon week end ! :D
Je te souhaite du soleil ( autant que le week end dernier pour Paris/Roubaix ) :D :D

Merci !

Daphn


Haut
 Profil Envoyer un e-mail  
 
MessagePosté: Mar 19 Avr 2011 08:32 
Avatar de l’utilisateur
Bonjour !

Bon ben j'ai pas trouvé totalement la solution à mon problème.
Je sais pas comment faire.. :( suis dépitée...
Personne donc ?

Daphn


Haut
 Profil Envoyer un e-mail  
 
MessagePosté: Mar 19 Avr 2011 08:34 
Administrateur
Avatar de l’utilisateur
Hello

Est ce que tu peux expliquer quel est ton objectif ?-)


Haut
 Profil Envoyer un e-mail  
 
MessagePosté: Mar 19 Avr 2011 08:49 
Avatar de l’utilisateur
Salut Aurélien !


il s'agit de regrouper des chaines de caractères.
Plus précisément, pour une référence, je peux avoir des anomalies. Celles ci sont définies par un code anomalie, puis par des données ( mes chaines de caractères). Ces données peuvent être sur plusieurs lignes, et pour éviter la redondance des infos, je veux regrouper et concaténer les textes d'anomalies.

Le truc, c'est qu'il peut y avoir pour la même référence; la même anomalie, plusieurs fois, avec des textes différents.
Plus haut dans mon 1er post, j'ai mis les tables, la première telle qu'elle est et la 2eme telle qu'il me la faudrait.

Pour l'exemple de la réf 1983, j'ai deux fois l'anomalie M2412, trois fois l'anomalie M2408, mais les textes varient, et une fois A2411. Pour l'anomalie 1409, je n'ai qu'une anomalie, qui n'a qu'une ligne de texte. Pour la réf 1983; je souhaiterai n'avoir plus que 6 lignes, soit le nombre d'anomalies, avec leur texte concaténé. J

J'espère que je suis assez claire... Mais je crois que les tables du 1er post sont parlantes.

Merci si tu peux m'aider !!! :lol:
Et j'en profite pour te dire que les cours de php et sql d'oseox m'aident bien dans ma découverte de ce langage !

Daphn


Haut
 Profil Envoyer un e-mail  
 
MessagePosté: Lun 25 Avr 2011 14:27 
Administrateur
Avatar de l’utilisateur
Et voila :)

(le code est peu être crade / pas optimisé mais il fonctionne)

Code:
<?php
   $db_server = "localhost"; //adresse du serveur MySQL
   $db_name = "os"; //nom de la base de données
   $db_user_login = "root"; //nom d'utilisateur pour la BD
   $db_user_pass = ""; //mot de passe pour la BD
   
mysql_connect("$db_server","$db_user_login","$db_user_pass") or
die("Impossible de se connecter");
mysql_select_db("$db_name");

$sql="SELECT * FROM anomalies WHERE code_ano != '' ";
$req = mysql_query($sql) or die('pb select');


// dans ce tableau on va stocker nos données, 1 ligne par code ano
$tab = array();

while($row = mysql_fetch_array($req)){

        $ref=$row['ref'];
        $code_ano=$row['code_ano'];
        $text_ano=$row['text_ano'];
       
        $cherche=$tab[$code_ano];

//Si code ano est déjà dans le tableau alors on concatène
        if (strpos($cherche,$code_ano)) {
            $tab[$code_ano].=" $text_ano";
        }else{
//Sinon on renseigne une ligne, en séparant chaque champ du caractère |
            $tab[$code_ano]="$ref|$code_ano|$text_ano";
        }
}


// Maintenant on a un beau tableau bien formaté, on injecte dans la BDD

foreach ($tab as $code_ano => $valeur) {

    $champs=explode("|",$valeur);

    $ref=$champs[0];
    $code_ano=$champs[1];
    $text_ano=$champs[2];

    $sql="INSERT INTO `new_anomalies` (`ref`, `code_ano`, `text_ano`) VALUES
('$ref',  '$code_ano', '$text_ano')";

    $req = mysql_query($sql) or die('pb insert');
   
print("$ref $code_ano $text_ano<br/><br />");
               
}

?>


Est ce que tu souhaites des questions sur un point en particulier ?


Haut
 Profil Envoyer un e-mail  
 
MessagePosté: Mar 26 Avr 2011 10:57 
Avatar de l’utilisateur
Salut Aurelien !

Merci pour ton aide, j'apprécie !!!! :D :D


Cependant ce n'est pas exactement ce que je dois atteindre !! :(

Voici un exemple pour une reference donnée, la 3891, apres un array_merge.
J'espere que je suis claire dans ce que j'écris... :oops:

J'ai pour une reference (3819), plusieurs anomalies( code_ano: M2412 (deux fois), M2408 (trois fois) et une fois A2411).*
Il y a plusieurs lignes de description pour une anomalie.
"PHASE DESEQUILIBREE 21", "PHASE DESEQUILIBREE 22", "CONSOMMATION FORTE HCH", "CONSOMMATION FORTE HPH", "CONSOMMATION FORTE P" et "ECART PRECISION-REPARTITEUR" sont les titres des anomalies.
Puis viennent les textes en rapport avec les anomalies ( par exemple pour les 4 premières lignes du tableau, soit pour la premiere anomalie :"GROUPE DE COMPTAGE: 01", "CONSO COMPTEUR 20 : 000002415", "CONSO COMPTEUR 21 : 000001200" et CONSO COMPTEUR 22 : 000002965).

Pour la premiere anomalie toujours, voici ce que je devrais avoir en final ( soit les 4 premieres lignes ) :
3891, "M2412", "PHASE DESEQUILIBREE 21 - GROUPE DE COMPTAGE: 01 - CONSO COMPTEUR 20 : 000002415 - CONSO COMPTEUR 21 : 000001200 - CONSO COMPTEUR 22 : 000002965".

les 2èmes valeurs sont les n° de ligne qui ont le code_ano non vide, et la 6ème valeur represente les lignes ayant un code anomalie vide.
Code:
$toto =array(
array(3891,  1, "M2412", "PHASE DESEQUILIBREE 21", 3891,  2,  "     ", "GROUPE DE COMPTAGE: 01"),
array(3891,  1, "M2412", "PHASE DESEQUILIBREE 21", 3891,  3,  "     ", "CONSO COMPTEUR 20 : 000002415"),
array(3891,  1, "M2412", "PHASE DESEQUILIBREE 21", 3891,  4,  "     ", "CONSO COMPTEUR 21 : 000001200"),
array(3891,  1, "M2412", "PHASE DESEQUILIBREE 21", 3891,  5,  "     ", "CONSO COMPTEUR 22 : 000002965"),
array(3891,  6, "M2412", "PHASE DESEQUILIBREE 22", 3891,  5,  "     ", "CONSO COMPTEUR 22 : 000002965"),
array(3891,  6, "M2412", "PHASE DESEQUILIBREE 22", 3891,  7,  "     ", "GROUPE DE COMPTAGE: 01"),
array(3891,  6, "M2412", "PHASE DESEQUILIBREE 22", 3891,  8,  "     ", "CONSO COMPTEUR 20 : 000002415"),
array(3891,  6, "M2412", "PHASE DESEQUILIBREE 22", 3891,  9,  "     ", "CONSO COMPTEUR 21 : 000001200"),
array(3891,  6, "M2412", "PHASE DESEQUILIBREE 22", 3891,  10,  "     ", "CONSO COMPTEUR 22 : 000002965"),
array(3891,  11, "M2408", "CONSOMMATION FORTE HCH", 3891,  10,  "     ", "CONSO COMPTEUR 22 : 000002965"),
array(3891,  11, "M2408", "CONSOMMATION FORTE HCH", 3891,  12,  "     ", "PERIODE DU : 22/11 AU 20/12"),
array(3891,  11, "M2408", "CONSOMMATION FORTE HCH", 3891,  13,  "     ", "PS:000000112 COEF: 2,50"),
array(3891,  11, "M2408", "CONSOMMATION FORTE HCH", 3891,  14,  "     ", "CONSO/JOUR REF:000000037"),
array(3891,  11, "M2408", "CONSOMMATION FORTE HCH", 3891,  15,  "     ", "CONSO/JOUR EN COURS:000000097"),
array(3891,  16, "M2408", "CONSOMMATION FORTE HPH", 3891,  15,  "     ", "CONSO/JOUR EN COURS:000000097"),
array(3891,  16, "M2408", "CONSOMMATION FORTE HPH", 3891,  17,  "     ", "PERIODE DU : 22/11 AU 20/12"),
array(3891,  16, "M2408", "CONSOMMATION FORTE HPH", 3891,  18,  "     ", "PS:000000112 COEF: 2,50"),
array(3891,  16, "M2408", "CONSOMMATION FORTE HPH", 3891,  19,  "     ", "CONSO/JOUR REF:000000031"),
array(3891,  16, "M2408", "CONSOMMATION FORTE HPH", 3891,  20,  "     ", "CONSO/JOUR EN COURS:000000118"),
array(3891,  21, "M2408", "CONSOMMATION FORTE P", 3891,  20,  "     ", "CONSO/JOUR EN COURS:000000118"),
array(3891,  21, "M2408", "CONSOMMATION FORTE P", 3891,  22,  "     ", "PERIODE DU : 22/11 AU 20/12"),
array(3891,  21, "M2408", "CONSOMMATION FORTE P", 3891,  23,  "     ", "PS:000000112 COEF: 2,50"),
array(3891,  21, "M2408", "CONSOMMATION FORTE P", 3891,  24,  "     ", "CONSO/JOUR REF:000000010"),
array(3891,  21, "M2408", "CONSOMMATION FORTE P", 3891,  25,  "     ", "CONSO/JOUR EN COURS:000000043"),
array(3891,  26, "A2411", "ECART PRECISION-REPARTITEUR", 3891,  25,  "     ", "CONSO/JOUR EN COURS:000000043"),
array(3891,  26, "A2411", "ECART PRECISION-REPARTITEUR", 3891,  27,  "     ", "CONSO TOTALE MONOS:000006580"),
array(3891,  26, "A2411", "ECART PRECISION-REPARTITEUR", 3891,  28,  "     ", "CONSO REPARTITEUR:000008020"),
array(3891,  26, "A2411", "ECART PRECISION-REPARTITEUR", 3891,  29,  "     ", "ECART: 1,10 "));



Tu vois comment je dois procéder ?
Merci encore pour ton aide, ça me pousse à continuer, même si les tableaux php, c'est pas toujours de la tarte on dirait ! :P
Mais je suis pas encore désespérée ... ( suis tétue :x , non mais !!!)

Daphn


Haut
 Profil Envoyer un e-mail  
 
Afficher les messages postés depuis:  Trier par  
Poster un nouveau sujet Répondre au sujet  [ 15 messages ]  Aller à la page 1, 2  Suivante

Heures au format UTC [ Heure d’été ]


Qui est en ligne

Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 1 invité


Vous ne pouvez pas poster de nouveaux sujets
Vous ne pouvez pas répondre aux sujets
Vous ne pouvez pas éditer vos messages
Vous ne pouvez pas supprimer vos messages
Vous ne pouvez pas joindre des fichiers

Rechercher:
Aller à:  
cron
Abonnez-vous au flux RSS

Blog

Forum

Offres d'emploi

Copyright : Moteur, traduction et optimisation
Merci de votre visite sur le forum Oseox