CI4: JOIN geeft dubbele (of meer) resultaten
Ik heb twee mysql tabellen (eenheden en statussen). De structuur voor deze tabellen is:
Eenheden:
id (int, PRIMARY, AI)
roepnummer (vchar(6)
locatie (varchar(255))
status (int)
leden (varchar(255)
telefoon (varchar(255))
Voorbeeld data:
id, roepnummer, locatie, status, leden, telefoon
1, '52-201', 'Centrale post', 1, 'Jan en henk', '0612345678'
2, '52-24', 'Start/Finish', 3, 'Jolanda', '0698765432'
3, '1597', 'Ambulance parkeer', 2, '0645678923'
Statussen:
id (int, PRIMARY, AI)
status (varchar(255))
bgcolor (varchar(7))
txtcolor (varchar(7))
Voorbeeld data:
id, status, bgcolor, txtcolor
1, 'Beschikbaar', '#FFFFFF', '#000000'
2, 'Behandelen', '#1d27ad', '#FFFFFF'
3, 'Pauze', '#FFFFFF', '#959c97'
Ik wil de volgende query uitvoeren:
SELECT
e.id, e.roepnummer, e.locatie, e.telefoon, e.leden, statussen.status, statussen.bgcolor as bgcolor, statussen.txtcolor as txtcolor
FROM
`eenheden` as e
JOIN
statussen ON e.status=statussen.id
Ik gebruik de volgende code:
Code (php)
1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
<?php
$db = \Config\Database::connect();
$builder = $db->table('eenheden');
$builder->select('e.id, e.roepnummer, e.locatie, e.telefoon, e.leden, statussen.status as status, statussen.bgcolor as bgcolor, statussen.txtcolor as txtcolor');
$builder->from('eenheden as e');
$builder->join('statussen', 'e.status = statussen.id');
return $builder->get()->getResultArray();
?>
$db = \Config\Database::connect();
$builder = $db->table('eenheden');
$builder->select('e.id, e.roepnummer, e.locatie, e.telefoon, e.leden, statussen.status as status, statussen.bgcolor as bgcolor, statussen.txtcolor as txtcolor');
$builder->from('eenheden as e');
$builder->join('statussen', 'e.status = statussen.id');
return $builder->get()->getResultArray();
?>
Nu komt het probleem waar ik mee zit. Ik krijg veel meer resultaten dan ik zou verwachten. Wanneer tabel Eenheden slechts 1 rij bevat, krijg ik 1 resultaat. Wanneer Eenheden twee rijen heeft, krijg ik 4 resultaten (2 per rij in eenheden, met identieke data). Met 3 rijen in Eenheden krijg ik 9 resultaten (3 per rij), enzovoort.
Wanneer ik de bovenstaande query handmatig uitvoer, werkt deze zoals ik zou verwachten.
Mis ik iets> Voegt CI4 iets toe aan mijn query dat hier voor zorgt? Of werkt mijn code snippet niet zoals ik verwachten zou en moet ik nog iets toevoegen? Ik staar mij hier al een week blind op, heb uren op Google gezocht, de CI4 documentatie meermaals doorgelezen. Ik kan het niet vinden.
Gewijzigd op 21/06/2020 13:21:39 door - Ariën -
... enige tijd later ...
Ja: https://codeigniter.com/user_guide/database/query_builder.html#selecting-data
Note
As shown earlier, the FROM portion of your query can is specified in the $db->table() function. Additional calls to from() will add more tables to the FROM portion of your query.
Uiteindelijk bak je met bovenstaande dus iets van:
Code (php)
1
2
3
4
2
3
4
select e.id, e.roepnummer, e.locatie, e.telefoon, e.leden, statussen.status as status,
statussen.bgcolor as bgcolor, statussen.txtcolor as txtcolor
from eenheden,eenheden as e
join statussen on e.status = statussen.id
statussen.bgcolor as bgcolor, statussen.txtcolor as txtcolor
from eenheden,eenheden as e
join statussen on e.status = statussen.id
Omdat tabel eenheden nu dubbel in je from staat (en de 2e netjes met een alias - anders kreeg je een error) en verder geen "joinende voorwaarde", join je nu elk record van eenheden aan elk ander record van eenheden.
Gewijzigd op 21/06/2020 13:45:17 door Rob Doemaarwat
Bernhard Flokstra op 21/06/2020 12:27:32:
Wanneer ik de bovenstaande query handmatig uitvoer, werkt deze zoals ik zou verwachten
Dit zou dus (inderdaad) suggereren dat CI hier blijkbaar iets anders van maakt. Het is dus (zeer) interessant om te zien of die stelling klopt. En als dat het geval is, dan zul je dus iets moeten veranderen in de aanpak. Maar eerst moet je weten wat voor concrete query CI hier van maakt.
Na het bouwen van de query kun je met behulp van:
De gegenereerde SQL ($sql) inspecteren.
Rob, bedankt!!! Dit was inderstaat het probleem. Ik heb nu from verwijderd en van ->table dit gemaakt:
$builder = $db->table('eenheden as e');
Dit doet exact wat ik zocht. Soms staar je jezelf zo blind op een probleem dat je gewoon recht over de oplossing heen leest.