SQL query uit meerdere tabellen

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Martijn Aikema

Martijn Aikema

15/04/2009 12:26:00
Quote Anchor link
Allen,

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)
PHP script in nieuw venster Selecteer het PHP script
1
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);
                      
?>


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?
 
PHP hulp

PHP hulp

08/01/2025 08:32:28
 
Dennis Mertens

Dennis Mertens

15/04/2009 12:30:00
Quote Anchor link
1: Waarom heb jij precies die tabel met prijshistorie? Alle prijzen kunnen toch in 1 tabel, en gewoon de nieuwste prijs pakken?
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.
 
Martijn Aikema

Martijn Aikema

15/04/2009 13:40:00
Quote Anchor link
1. Ik denk dat je daar inderdaad gelijk in hebt. Ik was uitgegaan van een veel-op-veel relatie tussen prijs en artikel, maar dit is natuurlijk gewoon een een-op-veel relatie. In dat geval neem ik dus het artikelnummer op in de tabel prijs?
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.
 
Jurgen assaasas

Jurgen assaasas

15/04/2009 13:53:00
Quote Anchor link
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.
 
Dennis Mertens

Dennis Mertens

15/04/2009 14:07:00
Quote Anchor link
Het id opslaan van de prijs.
Dan kun je de prijs altijd nog terug pakken.
 
Jurgen assaasas

Jurgen assaasas

15/04/2009 14:13:00
Quote Anchor link
Dennis Mertens schreef op 15.04.2009 14:07:
Het id opslaan van de prijs.
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.
 
Martijn Aikema

Martijn Aikema

15/04/2009 14:24:00
Quote Anchor link
Ik heb het inmiddels met jullie hulp als volgt opgelost:

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?
 
Martijn Aikema

Martijn Aikema

16/04/2009 17:52:00
Quote Anchor link
Ik heb inmiddels een nette oplossing gevonden om nog sneller de prijs inclusief btw te tonen. Ik doe dit met de volgende function:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
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;
}


?>


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:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
<?php

echo prijs($artikelnummer);

?>
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.