Meerdere queries uit verschillen tabellen
Ik zou graag twee id's uit twee verschillende tabellen selecteren. En met deze id's een derde tabel vullen. De id's zijn dus eigenlijk foreign keys (als ik het goed heb). Aan de hand van een ingevuld formulier verkrijg ik de info 'Productnaam' (uit tabel Product) en 'Voornaam','Familienaam' (uit tabel Klant) en het Aantal.
Dus met een 'Select'-query dacht ik zo de id's te verkrijgen uit de twee verschillende tabellen. Het lukt me niet om deze samen in één query te zetten. Aangezien de tabellen geen gemeenschappelijke kolommen hebben, leek een JOIN geen optie. Ik dacht ze dus in twee aparte te zetten? (zie stukje code onderaan)
BV:
tabellen
Product: id, productnaam, prijs
Klant: id, voornaam, familienaam
aankoop: klantId, productId, aantal
Tips om mij verder op weg te helpen?
Vriendelijk bedankt,
Karina
Ter illustratie: (Ik heb ook al geprobeerd de twee queries in één variable onder te brengen gescheiden met een ' ; ' maar dit zorgde voor wat errors.)
public function getIds(string $familienaam, string $voornaam, string $productnaam, int $aantal)
{
$sql = "select id as productId from producten where productnaam = :productnaam";
$sql2 = "select id as klantId from modules where familienaam = :familienaam and voornaam = :voornaam";
1 om je producten op te halen
1 om je klanten te vinden.
De aankopen kun je wel in 1 query ophalen: (voorbeeld voor klant met id = 123)
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
SELECT k.id klantid,
k.voornaam,
k.achternaam,
p.id productid,
p.productnaam
FROM Klant k
JOIN aankoop ak ON k.id = ak.klantId
JOIN Product p ON p.id = ak.productId
WHERE k.id = 123
k.voornaam,
k.achternaam,
p.id productid,
p.productnaam
FROM Klant k
JOIN aankoop ak ON k.id = ak.klantId
JOIN Product p ON p.id = ak.productId
WHERE k.id = 123
Je moet trouwens de prijs ook opslaan in de aankoop: als je later de prijs aanpast, weet je niet meer wat de klant moe(s)t betalen
Warning: foreach() argument must be of type array|object, bool given in /XXX/doc.php on line 55
Zou het kunnen omdat er geen resultaten in de array terecht komen? Ter info: de tabel aankopen is voorlopig leeg, maar aangezien ik niets ophaal uit die tabel zou dit geen problemen mogen opleveren?
Hier het volledige deel. Zoals je zit wil ik met de resultaten een object maken.
public function getArray(string $familienaam, string $voornaam, string $product, int $aantal)
{
$sql = "select k.id as klantId,
k.voornaam,
k.familienaam,
p.id as productId,
p.naam,
p.prijs
from klanten k
join aankopen ak ON k.id = ak.persoonId
join producten p ON p.id = pu.productId
where p.naam = :product and k.familienaam = :familienaam and k.voornaam = :voornaam";
$dbh = new PDO($this->dbConn, $this->dbUsername, $this->dbPassword);
$stmt = $dbh->prepare($sql);
$stmt->execute(array(
':familienaam' => $familienaam,
':voornaam' => $voornaam,
':product' => $product
));
$resultSet = $stmt->fetch(PDO::FETCH_ASSOC);
$lijst = array();
foreach ($resultSet as $rij) {
$aankoop = new Aankoop(
(int)$rij["klantId"],
$rij["voornaam"],
$rij["familienaam"],
$rij["productId"],
$rij["naam"],
$rij["prijs"]);
array_push($lijst, $aankoop);
}
$dbh = null;
return $lijst;
}
Wat zegt var_dump?
- Ariën - op 05/12/2021 20:03:05:
We hebben ook code-tags voor codes.
Wat zegt var_dump?
Wat zegt var_dump?
Hi,
Wanneer ik var_dump doe bij $resultSet, krijg ik dit. De variabelen in de foreach-loop hebben bijgevolg geen waarde.
bool(false)
Warning: foreach() argument must be of type array|object, bool given in /opt/XX/doc.php on line 56
array(0) { }
Warning: Undefined variable $punten in /opt/XXX.php on line 67
NULL
En plaats je code graag tussen codetags.
- Ariën - op 05/12/2021 20:31:42:
Bouw eens foutafhandeling in?
En plaats je code graag tussen codetags.
En plaats je code graag tussen codetags.
Hi, blijkt dat mijn SQL-statement niet correct is. Als ik ze test in myPhpAdmin, blijkt één kolomn bij elke waarde 'null' te geven, al zijn er gegevens voor deze id. Ook wanneer ik de beide 'RIGHT JOIN' doe of 'LEFT JOIN - RIGHT JOIN', 'RIGHT JOIN-LEFT JOIN'.
Adoptive Solution op 06/12/2021 20:20:46:
Hi, wanneer ik inner join gebruik, krijg ik geen resultaten terug. Ter info: de tabel aankopen is voorlopig leeg. Dus wat ik wil verkrijgen is de id van zowel klanten als producten aan de hand van een invulformulier.
BV. Ik vul in formulier: Klant Peeters koopt Wasmachine. Met een 'where'-statement wil ik zo de juist ID's verkrijgen uit de twee tabellen. ik krijg hierbij nog steeds een foutmelding ter hoogte van 'p.id where ... '
Nu zal er vast wel een of andere exotische query mogelijk zijn om middels een of andere outer join tussen klant en producten alles van beide te verkrijgen, maar dan waarschijnlijk in de aantallen "veel te veel".
Dus iets met 1000 producten en 200 klanten levert je 200.000 records met alle mogelijke combinaties op.
Veel eenvoudiger is het om je lijstje te bouwen met 2 losse query's:
een om alle producten op te halen
en een om alle klanten op te halen (al heb je hopelijk snel zo veel klanten dat je die niet allemaal in 1 lijstje wilt tonen).
Daarna schiet je klant_id en product_id (plus wat info als datum en prijs en aantallen) in de tabel Aankopen.
En dan kun je info ophalen over "wie" en "wat" gekocht is.
Ivo P op 07/12/2021 10:45:59:
Er is geen link tussen die klant en dat product: hij heeft hem nog niet gekocht.
Nu zal er vast wel een of andere exotische query mogelijk zijn om middels een of andere outer join tussen klant en producten alles van beide te verkrijgen, maar dan waarschijnlijk in de aantallen "veel te veel".
Dus iets met 1000 producten en 200 klanten levert je 200.000 records met alle mogelijke combinaties op.
Veel eenvoudiger is het om je lijstje te bouwen met 2 losse query's:
een om alle producten op te halen
en een om alle klanten op te halen (al heb je hopelijk snel zo veel klanten dat je die niet allemaal in 1 lijstje wilt tonen).
Daarna schiet je klant_id en product_id (plus wat info als datum en prijs en aantallen) in de tabel Aankopen.
En dan kun je info ophalen over "wie" en "wat" gekocht is.
Nu zal er vast wel een of andere exotische query mogelijk zijn om middels een of andere outer join tussen klant en producten alles van beide te verkrijgen, maar dan waarschijnlijk in de aantallen "veel te veel".
Dus iets met 1000 producten en 200 klanten levert je 200.000 records met alle mogelijke combinaties op.
Veel eenvoudiger is het om je lijstje te bouwen met 2 losse query's:
een om alle producten op te halen
en een om alle klanten op te halen (al heb je hopelijk snel zo veel klanten dat je die niet allemaal in 1 lijstje wilt tonen).
Daarna schiet je klant_id en product_id (plus wat info als datum en prijs en aantallen) in de tabel Aankopen.
En dan kun je info ophalen over "wie" en "wat" gekocht is.
Dag Ivo,
Bedankt! Dat brengt mij bij een volgende vraag, kan ik deze twee queries in één variable onderbrengen? Ik zou ze graag in één functie uitwerken en met die gegevens een object maken.
*Spambericht verwijderd*