SQL query uit meerdere tabellen
Ik ben bezig met het maken van een php-pagina waarop een aantal artikelen met hun naam, omschrijving en prijs worden genoemd. De gegevens worden uit de database van mijn website opgehaald.
Nu heb ik voor de prijs een aparte tabel gemaakt, omdat de prijs van een artikel wel eens kan wijzigen. Ik heb daarbij gebruik gemaakt van een tussentabel PrijsHistorie om de historie van een prijs per artikel makkelijk te kunnen achterhalen.
Artikel
----------
artikelnummer (key)
naam
omschrijving
....
Prijs
---------
prijsnummer (key)
prijs
btw
PrijsHistorie
--------------
prijshistorienummer (key)
artikelnummer
prijsnummer
Nu heb ik dus een query nodig om de gegevens uit de database in te lezen en te plaatsen op de site. Ik heb dit alsvolgt opgelost:
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$sql = "SELECT * FROM Artikel WHERE categorienummer = ".$categorie." AND status = 'te koop'";
$resultaat = mysql_query($sql);
while ($rij=mysql_fetch_array($resultaat)) {
$artikelnummer = $rij["artikelnummer"];
$sql2 = "SELECT * FROM PrijsPerArtikel WHERE artikelnummer = ".$artikelnummer.";";
$resultaat2 = mysql_query($sql2);
$rij2 = mysql_fetch_array($resultaat2);
$prijsperartikelnummer = $rij2["prijsperartikelnummer"];
$sql3 = "SELECT * FROM Prijs WHERE prijsperartikelnummer = ".$prijsperartikelnummer.";";
$resultaat3 = mysql_query($sql3);
$rij3 = mysql_fetch_arry($resultaat3);
?>
$sql = "SELECT * FROM Artikel WHERE categorienummer = ".$categorie." AND status = 'te koop'";
$resultaat = mysql_query($sql);
while ($rij=mysql_fetch_array($resultaat)) {
$artikelnummer = $rij["artikelnummer"];
$sql2 = "SELECT * FROM PrijsPerArtikel WHERE artikelnummer = ".$artikelnummer.";";
$resultaat2 = mysql_query($sql2);
$rij2 = mysql_fetch_array($resultaat2);
$prijsperartikelnummer = $rij2["prijsperartikelnummer"];
$sql3 = "SELECT * FROM Prijs WHERE prijsperartikelnummer = ".$prijsperartikelnummer.";";
$resultaat3 = mysql_query($sql3);
$rij3 = mysql_fetch_arry($resultaat3);
?>
De while-lus wordt verderop in de pagina weer netjes gesloten. Vervolgens kan de naam van het artikel bv worden weergegeven met $rij["naam"] en de prijs van het artikel met $rij3["prijs"].
Toch heb ik het idee dat het makkelijker en overzichtelijker kan. Kan iemand mij daarmee helpen? Of is bovenstaande de enige goede oplossing?
2: Aan jouw variabele kan ik niet zien wat de inhoud is. $rij3???
3: Het is handig om bij arrays enkele quotes te gebruiken.
4: Gebruik geen * om de veldnamen te pakken, maar gebruik een opsomming van alle velden die je wilt pakken.
2. Hierin staat dus de array met het resultaat van de query op regel 11.
3. Goede tip. Ik ga dit doorvoeren op mijn hele website
4. Dit gaat inderdaad op wanneer niet alle velden van de tabel worden gebruikt. Verderop in de pagina gebruik ik ook alle velden van de tabellen Artikel en Prijs.
Ik zou wel de prijzen erbij opslaan. Stel een product veranderd van prijs. Dan wordt ineens iets duurder terwijl mogelijk al iemand iets heeft besteld onder de oude prijs.
Dan kun je de prijs altijd nog terug pakken.
Dennis Mertens schreef op 15.04.2009 14:07:
Het id opslaan van de prijs.
Dan kun je de prijs altijd nog terug pakken.
Dan kun je de prijs altijd nog terug pakken.
Ja het is een overweging die je eigenlijk zelf moet afvragen wat je wil. Ik zou de totaalprijs opslaan zodat als er iemand komt klagen dat je de totaalprijs nog hebt en zo dus kan controleren wat het dus moet zijn. Als je 1 product aanpast veranderd de totaalprijs meteen. Of stel je maakt hem goedkoper en iemand klaagt dat hij te veel heeft betaald dan kun je altijd nog zijn prijs terughalen en valideren op datum.
Artikel
---------
naam
omschrijving
afbeelding
....
Prijs
---------
prijsnummer
artikelnummer
prijs
btw
ingangsdatum
einddatum (null)
Wanneer een prijs wijzigt kan dit worden doorgegeven. De nieuwe ingangsdatum van de prijs wordt dan opgeslagen en de prijs krijgt een nieuw prijsnummer.
Aan de hand van besteldatum kan dan worden geselecteerd welke prijs van toepassing was.
Daarnaast ga ik bovenstaand script nog iets vereenvoudigen met een function. Je zou dan aan zoiets moeten denken als
function prijs(artikelnummer)
Aan de hand van het artikelnummer wordt een SQL-query uitgevoerd en wordt de totaalprijs van het artikel berekend.
Is het daarnaast nog handig om de totaalprijs in de tabel bestelling of factuur vast te leggen? Of is dit niet nodig?
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
2
3
4
5
6
7
8
9
10
11
12
13
<?php
function prijs($artikelnr) {
$sql = "SELECT prijs, btw FROM Prijs WHERE artikelnummer = ".$artikelnr.";";
$resultaat = mysql_query($sql);
$rij=mysql_fetch_array($resultaat);
$prijs = $rij['prijs'] * ( 1 + ( $rij['btw'] / 100) );
return $prijs;
}
?>
function prijs($artikelnr) {
$sql = "SELECT prijs, btw FROM Prijs WHERE artikelnummer = ".$artikelnr.";";
$resultaat = mysql_query($sql);
$rij=mysql_fetch_array($resultaat);
$prijs = $rij['prijs'] * ( 1 + ( $rij['btw'] / 100) );
return $prijs;
}
?>
Vervolgens kan op de pagina de prijs heel makkelijk worden weergegeven met het volgende commando (uitgaande dat je het artikelnummer al hebt vastgelegd in een variabele: