/ Forside / Teknologi / Udvikling / Perl / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
Perl
#NavnPoint
bjarneA 141
poul_from 50
soccer 30
Nicknack 14
Tmpj 0
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

Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408914
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste