| 
					
							
        
    
        
						
			 | 
			
			
					    
					
        
         
          
         
	
            | Flad datastruktur konveret til 1:n, hvorda~ Fra : Torben | 
  Dato :  07-06-08 12:33 |  
  |   
            Jeg har følgende problem: skal udtrække nogle adresser og kontaktpersoner 
 og skrive dem ud således at firmadetaljer kommer 1 gang, mens 
 kontaktpersoner der hører til kommer derunder.
 
 Data ligger i MySQL i forskellige tabeller.
 
 Jeg gør pt. det at jeg laver en forespørgsel på firmaer, og for hvert 
 firmaid henter jeg kontaktpersoner. Dette fungerer godt men er langsomt, 
 da jeg skal lave en query for hver eneste firma.
 
 I stedet kunne jeg lave EN query med en join, og få data ud ala:
 
 
 a1, a2, a3, a4, b1, b2, b3
 a1, a2, a3, a4, c1, c2, c3
 a1, a2, a3, a4, d1, d2, d3
 
 a1,a2,a3 er firmaets detaljer. Der er andre firmaer med andre detaljer 
 senere.
 
 
 Altså array af alle firmaer med array af data for hver.
 
 MEN hvordan skriver jeg nu dette ud så jeg får
 
 a1, a2, a3, a4
        Person:       b1, b2, b3
        Person:       c1, c2, c3
        Person:       d1, d2, d3
 
 
 Jeg skal naturligvis på en måde traversere over arrayet, men er der nogen 
 som kan give praktiske hints ?
 
 Mvh
 
 
        
  
            
             |   |   
            
        
 
            
         
           Adam Sjøgren (07-06-2008) 
         
	
            | Kommentar Fra : Adam Sjøgren | 
  Dato :  07-06-08 13:16 |  
  |   
            On 07 Jun 2008 11:33:27 GMT, Torben wrote:
 
 > Jeg gør pt. det at jeg laver en forespørgsel på firmaer, og for hvert 
 > firmaid henter jeg kontaktpersoner. Dette fungerer godt men er langsomt, 
 > da jeg skal lave en query for hver eneste firma.
 
 > I stedet kunne jeg lave EN query med en join, og få data ud ala:
 
 > a1, a2, a3, a4, b1, b2, b3
 > a1, a2, a3, a4, c1, c2, c3
 > a1, a2, a3, a4, d1, d2, d3
 
 Hvor meget hurtigere er det end en søgning per firma? Taler vi om
 minutter? Timer? Sekunder?
 
 > Altså array af alle firmaer med array af data for hver.
 
 > MEN hvordan skriver jeg nu dette ud så jeg får
 
 > a1, a2, a3, a4
 >        Person:       b1, b2, b3
 >        Person:       c1, c2, c3
 >        Person:       d1, d2, d3
 
 > Jeg skal naturligvis på en måde traversere over arrayet, men er der nogen 
 > som kan give praktiske hints ?
 
 Start altid med at skrive hvad du har prøvet. Det gør det meget nemmere
 at hjælpe!
 
 Måske noget i stil med:
 
  my %company;
  foreach my $row (@rows) {
      push @{ $company{$row->{company}} }, $row->{person};
  }
 
 Så ender du med at %company består af alle firmaer som keys og værdien
 er en array-ref, hvor array'et indeholder personerne i det firma.
 
                                  o o o
 
 Her er eksemplet i kørbar udgave med dummy data:
 
  #!/usr/bin/perl
 
  use strict;
  use warnings;
 
  my @rows=( { company=>'Firma1', person=>'PersonA' },
             { company=>'Firma2', person=>'PersonB' },
             { company=>'Firma1', person=>'PersonC' },
             { company=>'Firma1', person=>'PersonD' },
           );
 
  my %company;
  foreach my $row (@rows) {
      push @{ $company{$row->{company}} }, $row->{person};
  }
 
  foreach my $comp (sort keys %company) {
      print "$comp\n";
      foreach my $person (@{$company{$comp}}) {
          print "\t$person\n";
      }
  }
 
 Uddata er:
 
  $ ./test.pl 
  Firma1
          PersonA
          PersonC
          PersonD
  Firma2
          PersonB
  $ 
 
 Dine rækker ser naturligvis anderledes ud, ovenstående er bare en
 skitse.
 
                                  o o o
 
 Når du bygger datastrukturer er Data::Dumper et herligt modul til at
 checke om strukturen indeholder det du tror den gør, f.eks.:
 
  use Data::Dumper;
 
  # ...
 
  print Dumper(\%company);
 
 giver:
 
  $VAR1 = {
            'Firma1' => [
                          'PersonA',
                          'PersonC',
                          'PersonD'
                        ],
            'Firma2' => [
                          'PersonB'
                        ]
          };
 
 
   Mvh.
 
 -- 
  "You have to photosynthesize"                                Adam Sjøgren
                                                          asjo@koldfront.dk
  
            
             |   |   
            
        
 
            
         
           Torben (07-06-2008) 
         
	
            | Kommentar Fra : Torben | 
  Dato :  07-06-08 17:39 |  
  |   
            asjo@koldfront.dk (Adam Sjøgren) wrote in
 news:87bq2dsann.fsf@topper.koldfront.dk: 
 
 > Hvor meget hurtigere er det end en søgning per firma? Taler vi om
 > minutter? Timer? Sekunder?
 
 Ahhh. det er nok i dette eksempel et spsm om sekunder.. men
 langt mere et spsm om at lære lidt mere Perl :)
 
 Sådan ala "2+2 på 101 måder"
 
 
 Jeg takker mange gange for dit input :)
 
  
            
             |   |   
            
        
 
            
         
           Adam Sjøgren (07-06-2008) 
         
	
            | Kommentar Fra : Adam Sjøgren | 
  Dato :  07-06-08 18:12 |  
  |  
 
            On 07 Jun 2008 16:38:34 GMT, Torben wrote:
 > asjo@koldfront.dk (Adam Sjøgren) wrote in
 > news:87bq2dsann.fsf@topper.koldfront.dk: 
 >> Hvor meget hurtigere er det end en søgning per firma? Taler vi om
 >> minutter? Timer? Sekunder?
 > Ahhh. det er nok i dette eksempel et spsm om sekunder.. men
 > langt mere et spsm om at lære lidt mere Perl :)
 Fair nok   
> Jeg takker mange gange for dit input :)
 Vi glæder os til at se hvordan din løsning kom til at se ud her i
 gruppen.
   Mvh.
    Adam
 -- 
  "You have to photosynthesize"                                Adam Sjøgren
                                                          asjo@koldfront.dk
            
              |   |   
            
        
 
    
 
					
					 
			 | 
			
				
        
			 |