Gegevens uit en andere table halen voor een Echo opdracht
ik heb een kleine uitdaging:
Hieronder een stukje code, waarin ik ga kijken uit welke landen we een registratie hebben.
Het programma werkt echter met country id's en de uitkomst van deze id staat in een andere table. (table 2)
nu is mijn vraag is het mogelijk om het country_id te vervangen met de juiste uitkomst uit table 2
Voorbeeld :
In table 1 is voor Nederland country_id 150 opgenomen.
Om Nederland op het scherm te krijgen moet ik uit table 2 bij country_id 150 country_name Nederland op gaan halen.
foreach($dbh->query('SELECT country_id,COUNT(*)
FROM table 1
GROUP BY country_id') as $row)
{
echo "<tr>";
echo "<td> " . $row['country_id'] . "</td>";
echo "<td>  " . $row['COUNT(*)'] . "</td>";
echo "</tr>";
}
Echter telt hij nu alleen het eerste item en geen volgende
Ik heb bijvoorbeeld 3 records
1 country_id = 150 = Nederland
2 country_id = 57 = Denemarken
3 country_id = 150 = Nederland
De land namen komen uit de countries table.
Ik krijg nu alleen 2 x Nederland en geen Denemarken.
Hieronder mijn aangepaste code :
/**foreach($dbh->query('SELECT country_id,COUNT(*)
FROM e5jn1_j2store_addresses
GROUP BY country_id') as $row);**/
foreach($dbh->query('SELECT e5jn1_j2store_addresses.country_id, e5jn1_j2store_countries.country_name, COUNT(*)
FROM e5jn1_j2store_addresses
LEFT JOIN e5jn1_j2store_countries ON e5jn1_j2store_addresses.country_id = e5jn1_j2store_countries.j2store_country_id
GROUP BY country_name') as $row);
{
echo "<tr>";
echo "<td> " . $row['country_name'] . "</td>";
echo "<td>  " . $row['COUNT(*)'] . "</td>";
echo "</tr>";
}
Ik heb die lange tabelnamen van jou even verkort naar de namen shop en country dus als je die even aanpast naar jouw namen en zo ook de kolomnamen dan zou het moeten werken.
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
SELECT
c.id, c.name, COUNT(s.id) AS amount
FROM
country c
LEFT JOIN
shop s ON c.id = s.country_id
GROUP BY
c.id
ORDER BY
c.name
c.id, c.name, COUNT(s.id) AS amount
FROM
country c
LEFT JOIN
shop s ON c.id = s.country_id
GROUP BY
c.id
ORDER BY
c.name
De query geeft ALLE landen terug op alfabetische volgorde met hun id en naam en daarnaast een kolom 'amount' met het aantal shops in die voor het betreffende land voorkomen in de database. Sommige landen kunnen 0 shops hebben. Daarom doe ik niet count(*) maar count(s.id). zou ik count(*) doen dan worden ook de landen zonder shops geteld en op 1 gezet.
Wil je de landen zonder shops er uit laten dan kun je van de LEFT JOIN een gewone JOIN maken.
Gewijzigd op 20/10/2019 00:49:39 door Frank Nietbelangrijk
Bedankt om me de juiste richting op de helpen, het werkt inmiddels.
Wat ik ook nog zag is dat ik een ; achter mijn telling had staan waardoor hij daar stopte en niet meer verder ging met tellen.
Maar het is opgelost en het werkt.
Anders zou je de shops als uitgangspunt kunnen nemen en (wederom met een LEFT JOIN) kunnen controleren of er toevallig ook shops zijn die per abuis niet aan een land gekoppeld zijn. Dit zou dan een indicatie zijn dat er iets niet klopt in de administratie.
En als het uitganspunt "shops tellen" (per land) is, dan weet je ook zeker dat je op die manier geen shops achterwege laat, ongeacht of deze op een correcte manier gekoppeld zijn aan een andere tabel of niet.
Het gaat om een inschrijving voor een evenement waarbij er deelnemers uit meerdere landen komen.\
Op de website willen we een lijstje tonen uit welke landen we inschrijvingen hebben.
Voorheen had ik dit zelf in de hand omdat ik toen met Fabrik werkte, echter met de wens van een verplichte betaling zijn we overgestapt op J2store welke een ingebouwde landen lijst heeft welke we verplicht moeten gebruiken.
In de lijst met verkochte tickets komt alleen de landcode te staan welke ik via de LEFT JOIN aan het juiste landsnaam gekoppeld heb om dit te tonen op de website.
$query = $db->getQuery(true);
$query->select('gegeven_uit_je_andere_tabel')->from('naam_andere_tabel')
->where('landID ='. 'landID_van_je_huidige_tabel');
$db->setQuery($query);
$results = $db->loadResult();
if ($results == "")
{return 'no results';}
else {return $results;}
Stel in je 'huidige_tabel' staat het landID dan kan je met de bovenstaande $results; de naam van het land uit de andere tabel halen.
Wederom: waar komen de methoden select(), from() en where() vandaan?
Hoe kom je bij een return?
Ik kan mij ook niet voorstellen dat loadResult() -wat dat ook moge zijn- echt een lege string retourneert, of dat ding/library/whatever moet nogal brak in elkaar zitten. Misschien was je op zoek naar false? Dit is in een ==-vergelijking wel equivalent met false, maar echt netjes is het niet. Tis zoiets als appels en peren vergelijken en dan zeggen "ja, het is allebei fruit".
En als je dan returns nodig zou hebben, dan zou je niet "no results" moeten retourneren, maar iets met wat meer structuur, zoals een leeg array of false.
Stel je voor, dat er andere code is die dit verder afhandelt (wat de "return" min of meer impliceert). Die zou dan expliciet moeten controleren op de string "no results" om te besluiten wat er moet gebeuren (of een controle of de waarde een array is of whatever). Dat is een goede manier om voort te borduren op een slecht ontwerp.
Je zou dus net zo goed, of wellicht beter, simpelwg $results kunt teruggeven, dan kan dat if-statement ook meteen weg.
Denk je echt na over wat je typt? Of draai je aan een of andere vleesmolen waar woorden en codepassages uitrollen?
Ja, het is evident dat je beide tabellen op een bepaalde wijze aan elkaar moet fietsen, hoe je dit vervolgens in een of andere code-variant uitrolt is in zekere zin abstractie, het maakt niet uit. Dus het geven van een specifieke implementatie die out-of-the-box niet gaat werken met nauwelijks een toelichting over het waarom... dat is niet echt verhelderend wel?
Gewijzigd op 26/10/2019 14:48:35 door Thomas van den Heuvel