While & query

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Jel Open

Jel Open

15/02/2018 15:25:43
Quote Anchor link
Beste,

Ik heb iets als:

Tabel 1: gebruikers
[id][naam][...]

Tabel 2:
[id][id_gebruiker][waarde]

Nu wil ik een tabel tonen als:
|Tabel 1.id|Tabel 2.waarde|Tabel 2.waarde|Tabel 2.waarde|Tabel 2.waarde|Tabel 2.waarde|Tabel 2.waarde|Tabel 2.waarde|Tabel 2.waarde|Tabel 2.waarde|
|Tabel 1.id|Tabel 2.waarde|Tabel 2.waarde|Tabel 2.waarde|Tabel 2.waarde|Tabel 2.waarde|Tabel 2.waarde|Tabel 2.waarde|Tabel 2.waarde|Tabel 2.waarde|
|Tabel 1.id|Tabel 2.waarde|Tabel 2.waarde|Tabel 2.waarde|Tabel 2.waarde|Tabel 2.waarde|Tabel 2.waarde|Tabel 2.waarde|Tabel 2.waarde|Tabel 2.waarde|
etc.

Hiervoor heb ik twee while loops met een query daarin wat zorgt voor eindeloos aantal opvragingen. Het script wordt zeer traag...

Hoe los ik dit op?

Groet,
 
PHP hulp

PHP hulp

23/12/2024 15:18:01
 
Thomas van den Heuvel

Thomas van den Heuvel

15/02/2018 16:06:38
Quote Anchor link
Dus de waarden van tabel 2, gegroepeerd per gebruiker.

Wat voor database-engine hebben deze tabellen? Ik neem aan dat we het hebben over MySQL? Is dit MyISAM, of InnoDB? Wanneer je een echte relationele database wilt maken is InnoDB waarschijnlijk geschikter omdat je daarmee echt verbanden tussen tabellen kunt aanmaken (foreign keys enzo).

Als de tabellen InnoDB gebruiken en je tabel2.id_gebruiker als foreign key definieert wordt er automatisch een index op aangemaakt, wat zorgt voor snelle lookup.

Voor het geval de tabellen MyISAM zijn loont het de moeite om een index aan te maken op tabel2.id_gebruiker, maar beter zou zijn dat je InnoDB gebruikt, want met MyISAM hangen deze tabellen toch een beetje als los zand aan elkaar en is de kans groot dat er data blijft hangen bij DELETE acties enzo. Het is een stuk makkelijker om referentiële integriteit (onderlinge kloppendheid van data tussen tabellen) te behouden als je hele strakke regels hebt omtrent de verbanden tussen de tabellen, wat vele malen makkelijker te bereiken is met InnoDB.
Gewijzigd op 15/02/2018 16:07:08 door Thomas van den Heuvel
 
Jel Open

Jel Open

15/02/2018 16:47:13
Quote Anchor link
Het betreft hier een InnoDB.
De tabellen zijn in de database niet rechtstreek aan elkaar gekoppeld. Maar persoonlijk denk ik dat het komt omdat ik door de while loop 1000+ queries naar de database stuur.
Is het niet mogelijk dat ik in één query alle data van tabel2 ophaal op basis van het id uit tabel 1 en die allemaal daarna toon? Dat scheelt al behoorlijk wat opvragingen.
 
Thomas van den Heuvel

Thomas van den Heuvel

15/02/2018 16:56:28
Quote Anchor link
Ja? Met een simpele JOIN? Of een gegroepeerde waarde, meerdere opties mogelijk.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
SELECT g.id, GROUP_CONCAT(w.waarde) AS values
FROM gebruikers g
LEFT JOIN <naam tabel 2> w ON (w.gebruiker_id = g.id)
GROUP BY g.id
 
Jel Open

Jel Open

15/02/2018 17:13:07
Quote Anchor link
Ja top!
En hoe krijg ik die dan in een array zonder while loop?
 
Thomas van den Heuvel

Thomas van den Heuvel

15/02/2018 17:57:29
Quote Anchor link
Niet? Je zult de resultaten nog steeds rij voor rij uit moeten lezen. Maar je hebt maar één while-loop en één query nodig.
 
Jel Open

Jel Open

16/02/2018 10:03:29
Quote Anchor link
Ja oke!
Maar daarmee zit ik nog niet op een lekkere snelheid. :-(
 
Thomas van den Heuvel

Thomas van den Heuvel

16/02/2018 16:20:00
Quote Anchor link
Maar dat komt dan doordat je geen foreign key hebt aangemaakt op de tweede tabel. Die dan dus ook geen index heeft voor snelle lookup.

Hoe luiden beide tabeldefinities nu als je:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
SHOW CREATE TABLE <tabelnaam>;

uitvoert?
 



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.