php array in een array uit mysql

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • ro8in
  • Registratie: Februari 2011
  • Laatst online: 18-08 19:36
Stel ik heb een database met 2 tabellen
1 tabel is bijvoorbeeld landen en de 2e tabel is personen.

Ik heb in tabel 1 bijvoorbeeld 10 landen en in tabel 2 100 personen

nou wil ik een multidimensionaal array hebben van alle landen en onder elk land weer alle personen die uit dat land komen

nou kan ik bijvoorbeeld doen
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
$sql = "SELECT * FROM landen";
//ik heb me eigen mysql class waarbij ik de boel wat simpeler maak
$landen = $mijneigenmysqlclass->get_array($sql);

$i=0;
foreach($landen as $row) {
     $final[$i]['naam'] = $row['naam'];
     $final[$i]['landid'] = $row['landid'];
     $sql = "SELECT * FROM personen WHERE landid = '" . $row['landid'] . "'";
     $final[$i]['personen'] = $mijneigenmysqlclass->get_array($sql);
     $i++;
}


Nu eindig ik dus met een multidimensionaal array $final die precies is zoals ik het nodig heb. Alleen stel dat er nu 10000 landen zijn en 1000000den personen dan maakt dit loopje een hoop query's.

Kan dit op een betere manier doormiddel van bijvoorbeeld JOINS te gebruiken of iets?

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21-09 21:47

Creepy

Tactical Espionage Splatterer

Kan dit op een betere manier doormiddel van bijvoorbeeld JOINS te gebruiken of iets?
Ja: Programming FAQ - SQL - Hoe werken joins

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
My eyes! It burns!

Je kan joins gebruiken, inderdaad.

Misschien een ActiveRecord framework gebruiken, scheelt je een hoop querygezeik.

Een snelle zoekopdracht later kwam ik deze tegen die er wel OK uitziet: http://www.propelorm.org/

[ Voor 50% gewijzigd door Gamebuster op 07-10-2011 14:50 ]

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • ro8in
  • Registratie: Februari 2011
  • Laatst online: 18-08 19:36
Probleem is dus dat met alle JOINS die ik ken en uit voorbeelden heb gezien ik niet eindig met het resultaat zoals in mijn loop. (of ze doen het zelfde..) Ik eindig altijd in een single dimension array waarbij dan landen dubbel staan om personen aan te vullen...

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
Klopt, daar moet je dus zelf je functie voor aanpassen.

-Of bespaar je een hoop moeite, SQL injection risico's e.d. en gebruik gewoon een ActiveRecord framework.

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • ro8in
  • Registratie: Februari 2011
  • Laatst online: 18-08 19:36
Ok maar stel wil dus geen activeframework voor een reden die ik nu even niet kan verzinnen.

Is mijn loop dan de beste manier om de array de constructueren of kan het sneller door bijvoorbeeld eerst alle data uit de tabellen in array's te gooien ?

Acties:
  • 0 Henk 'm!

  • Gamebuster
  • Registratie: Juli 2007
  • Laatst online: 15-09 23:08
ro8in schreef op vrijdag 07 oktober 2011 @ 15:00:
Ok maar stel wil dus geen activeframework voor een reden die ik nu even niet kan verzinnen.
Eigenwijs. Je lijkt mij wel.
ro8in schreef op vrijdag 07 oktober 2011 @ 15:00:
Is mijn loop dan de beste manier om de array de constructueren of kan het sneller door bijvoorbeeld eerst alle data uit de tabellen in array's te gooien ?
Geen idee wat dit betekend.

De "beste" manier lijkt mij om 1 query met join te gebruiken en dan het resultaat om te zetten in jouw gewenste resultaat. Een SQL query versturen heeft veel overhead en het aantal queries moet je zoveel mogelijk beperken.

Let op: Mijn post bevat meningen, aannames of onwaarheden


Acties:
  • 0 Henk 'm!

  • ro8in
  • Registratie: Februari 2011
  • Laatst online: 18-08 19:36
Gamebuster schreef op vrijdag 07 oktober 2011 @ 15:05:
[...]

Eigenwijs. Je lijkt mij wel.
_/-\o_

Ik wil altijd graag zelf weten hoe het werkt voordat ik een framework het voor mij laat doen :) Ik ken genoeg mensen die niet eens meer zonder framework kunnen, omdat ze nooit anders hebben geleerd.
Geen idee wat dit betekend.

De "beste" manier lijkt mij om 1 query met join te gebruiken en dan het resultaat om te zetten in jouw gewenste resultaat. Een SQL query versturen heeft veel overhead en het aantal queries moet je zoveel mogelijk beperken.
Dus gewoon met een LEFT JOIN de data ophalen en dan in mijn loop filteren?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Het hele probleem ontstaat door 't feit dat je aanneemt dat SQL een 'multidimensionale' array kan teruggeven. Dat is niet zo. Je probleem zit 'm niet in de set die je terugkrijgt als je een join gebruikt, maar in je presentatielaag.

code:
1
2
3
4
select c.id as countryid, c.name as countryname, p.id as personid, p.name as personname
from country c
inner join person p on p.countryid = c.id
order by c.name, c.id, p.name

code:
1
2
3
4
5
6
7
8
currentcountry = null;
foreach (records as r)
  if r->countryid != currentcountry {
    echo '<strong>' + r->countryname + '</strong>'
    currentcountry = r->countryid
  }
  echo r->personname
}


Afhankelijk van het soort relatie tussen country/person gebruik je left/inner. Is een land optioneel (dus nullable) in de person tabel dan gebruik je left, anders inner.
Gamebuster schreef op vrijdag 07 oktober 2011 @ 15:05:
Een SQL query versturen heeft veel overhead en het aantal queries moet je zoveel mogelijk beperken.
Een query "versturen" kost geen zak, telkens de DB opnieuw aan 't werk zetten, terwijl je ook meteen om 'alles' had kunnen vragen, daarentegen wel. Bovenstaande (pseudo) code gaat er van uit dat een land niet nullable is bij een person; is dat in jouw geval wel zo dan zul je even de "currentcountry" op een andere waarde moeten initialiseren (bijv. -1 ofzo).

[ Voor 36% gewijzigd door RobIII op 07-10-2011 15:21 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • ro8in
  • Registratie: Februari 2011
  • Laatst online: 18-08 19:36
RobIII schreef op vrijdag 07 oktober 2011 @ 15:13:
Het hele probleem ontstaat door 't feit dat je aanneemt dat SQL een 'multidimensionale' array kan teruggeven. Dat is niet zo. Je probleem zit 'm niet in de set die je terugkrijgt als je een join gebruikt, maar in je presentatielaag.

code:
1
2
3
4
select c.id as countryid, c.name as countryname, p.id as personid, p.name as personname
from country c
inner join person p on p.countryid = c.id
order by c.name, c.id, p.name

code:
1
2
3
4
5
6
7
8
currentcountry = null;
foreach (records as r)
  if r->countryid != currentcountry {
    echo '<strong>' + r->countryname + '</strong>'
    currentcountry = r->countryid
  }
  echo r->personname
}


Afhankelijk van het soort relatie tussen country/person gebruik je left/inner. Is een land optioneel (dus nullable) in de person tabel dan gebruik je left, anders inner.


[...]

Een query "versturen" kost geen zak, telkens de DB opnieuw aan 't werk zetten, terwijl je ook meteen om 'alles' had kunnen vragen, daarentegen wel.
Ok duidelijk ik ga je voorbeeld volgen. Ik had nog niet gedacht aan eerst alle data ophalen en dan filteren inderdaad.

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
ro8in schreef op vrijdag 07 oktober 2011 @ 15:21:
Ik had nog niet gedacht aan eerst alle data ophalen en dan filteren inderdaad.
Filteren laat je bij voorkeur nou weer net doen door het RDBMS (lees: je database). Daar zijn where-clauses voor. Wat deze (pseudo) code doet is niet 'filteren' maar niet domweg alles afdrukken. Als je dat 'filteren' wil noemen, best. Maar als je bijv. alleen mannen wil tonen dan ga je dus niet alles ophalen en vervolgens in de foreach een if p->sexe == 'm' doen. Dan doe je gewoon een where p.sexe = 'm' in je query.

[ Voor 24% gewijzigd door RobIII op 07-10-2011 15:26 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • ro8in
  • Registratie: Februari 2011
  • Laatst online: 18-08 19:36
RobIII schreef op vrijdag 07 oktober 2011 @ 15:24:
[...]

Filteren laat je bij voorkeur nou weer net doen door het RDBMS (lees: je database). Daar zijn where-clauses voor. Wat deze (pseudo) code doet is niet 'filteren' maar niet domweg alles afdrukken. Als je dat 'filteren' wil noemen, best. Maar als je bijv. alleen mannen wil tonen dan ga je dus niet alles ophalen en vervolgens in de foreach een if p->sexe == 'm' doen. Dan doe je gewoon een where p.sexe = 'm' in je query.
Zou je misschien ook een voorbeeld kunnen geven met als er een 3e tabel is met bijvoorbeeld dieren dat je dus per land de personen en de dieren die er wonen wil afdrukken?

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
ro8in schreef op vrijdag 07 oktober 2011 @ 15:28:
[...]


Zou je misschien ook een voorbeeld kunnen geven met als er een 3e tabel is met bijvoorbeeld dieren dat je dus per land de personen en de dieren die er wonen wil afdrukken?
Nee. Daar mag je eerst zélf eens 5 minuten, en als het moet langer, voor gaan zitten. Het is geen rocket science. Schrijf gewoon eens, voor mijn part in Nederlands, de stappen op die je uit zou moeten voeren. Voor 3, 4 of, hell, 10 verschillende niveau's is het echt niet anders.
Give a man a fish and feed him for a day. Teach a man how to fish and feed him for a lifetime.
We zitten hier niet om handjes te houden of oplossingen op een zilveren presenteerblaadje aan te reiken ;) Zie ook scriptrequests ;)

[ Voor 15% gewijzigd door RobIII op 07-10-2011 15:34 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij

Pagina: 1