Gegevens uit en andere table halen voor een Echo opdracht

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Manfred vd waarsenburg

Manfred vd waarsenburg

19/10/2019 17:12:29
Quote Anchor link
Beste mensen,

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>&nbsp" . $row['country_id'] . "</td>";
echo "<td>&nbsp;&nbsp;&nbsp;&nbsp" . $row['COUNT(*)'] . "</td>";
echo "</tr>";
}
 
PHP hulp

PHP hulp

19/04/2024 15:56:20
 
Adoptive Solution

Adoptive Solution

19/10/2019 19:09:56
Quote Anchor link
Probeer het op te lossen met een JOIN.

https://www.w3schools.com/sql/sql_join.asp
 
Manfred vd waarsenburg

Manfred vd waarsenburg

19/10/2019 19:40:56
Quote Anchor link
bedankt voor de info, ik ben even aan het stoeien ermee, en ik heb al een positief resultaat.
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>&nbsp" . $row['country_name'] . "</td>";
echo "<td>&nbsp;&nbsp;&nbsp;&nbsp" . $row['COUNT(*)'] . "</td>";
echo "</tr>";
}
 
Frank Nietbelangrijk

Frank Nietbelangrijk

20/10/2019 00:46:27
Quote Anchor link
Een query gebruik je liever niet in een lus. De kunst is om met één query de informatie te vergaren die je strict nodig hebt.

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

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
 
Manfred vd waarsenburg

Manfred vd waarsenburg

20/10/2019 08:37:06
Quote Anchor link
Beste Frank,

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.
 
Thomas van den Heuvel

Thomas van den Heuvel

20/10/2019 16:28:24
Quote Anchor link
Interessant is natuurlijk ook of dit een echte relationele database betreft waarbij er echte verbanden (constraints) bestaan tussen de tabellen.

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.
 
Manfred vd waarsenburg

Manfred vd waarsenburg

20/10/2019 20:21:18
Quote Anchor link
Het gaat hier niet om Shop en er bestaat ook geen kans dat ze niet gekoppeld zijn aan een land.
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.
 
Mozen Rozendale

Mozen Rozendale

26/10/2019 14:17:26
Quote Anchor link
$db = $db_connection;
$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.
 
Thomas van den Heuvel

Thomas van den Heuvel

26/10/2019 14:42:45
Quote Anchor link
Laten we dit eens kort analyseren.

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
 



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.