Ik zit een beetje met een redelijk "complex" probleem, tenminste ik heb zelf niet zoveel ervaring om dit probleem alleen aan te pakken, omdat ik ook niet weet hoe ik hier een oplossing moet vinden.
We nemen hier even een fictieve situatie, aangezien mijn situatie iets teveel om uitleg vraagt. Uiteraard hoef ik hier geen uitleg over de database structuur, aangezien dit alleen het probleem schetst en mijn database het probleem ook bevat, maar wel een goede structuur bevat.
Stel, je hebt de volgende tabellen:
Nu wil ik gebruikers en acties met elkaar in 1 overzicht hebben. Er zit echter wel een voorwaarde aan, dat voor elke gebruiker alleen de laatste actie erbij moet staan. Hierbij bedoel ik de laatste dmv de datum, dus niet het ID. Als de gebruiker geen actie heeft dan moet hij er ook bij staan, maar dan met die velden leeg.
In dit geval zou het de volgende resultaat moeten leveren:
Ik wil dit echter met 1 query doen, is dit mogelijk?
Verder dan dat kom ik niet, omdat ik niet weet wat ik dan moet doen. Nu heb ik alle regels te pakken uit beide tabellen, maar ik wil voor elke gebruiker 1 regel en die zit ook nog aan een voorwaarde vast, namelijk dat het de laatste is, als die gesorteerd zou zijn op datum.
Hoe krijg ik dat dus voor elkaar in 1 query?
Ik doe nu dmv PHP 2 query's combineren. Dit gaat ook wel goed, maar ik wil de query kunnen ordenen vanuit de database. Dit heeft te maken met dat ik een abstractie laag gebruik met een datagrid. Ik wil die datagrid kunnen ordenen, maar die datagrid heeft ook nog paging. Dus ik wil onafhankelijk van die paging kunnen ordenen op alle pagina's. Maar het moet qua performance ook goed lopen bij 1000en records. Dus die paging moet al gebeuren bij de query (LIMIT enzo). Daarom wil ik het dus in 1 query regelen, want dan kan ik de ordening op beide tabellen gewoon in de query regelen.
We nemen hier even een fictieve situatie, aangezien mijn situatie iets teveel om uitleg vraagt. Uiteraard hoef ik hier geen uitleg over de database structuur, aangezien dit alleen het probleem schetst en mijn database het probleem ook bevat, maar wel een goede structuur bevat.
Stel, je hebt de volgende tabellen:
| Gebruikers | |
| ID | Naam |
| 1 | Gebruikertje |
| 2 | Hans |
| 3 | Kees |
| gebruikers_acties | |
| gebruikerID | actieID |
| 1 | 1 |
| 1 | 2 |
| 2 | 3 |
| 2 | 4 |
| 2 | 5 |
| Acties | ||
| ID | Titel | Datum |
| 1 | Actie oud | 2007-06-10 11:30:00 |
| 2 | Actie nieuw | 2007-07-21 10:30:00 |
| 3 | Actie neutraal | 2007-06-10 11:30:00 |
| 4 | Actie oud | 2007-03-05 17:30:00 |
| 5 | Actie nieuwste | 2007-11-15 13:00:00 |
Nu wil ik gebruikers en acties met elkaar in 1 overzicht hebben. Er zit echter wel een voorwaarde aan, dat voor elke gebruiker alleen de laatste actie erbij moet staan. Hierbij bedoel ik de laatste dmv de datum, dus niet het ID. Als de gebruiker geen actie heeft dan moet hij er ook bij staan, maar dan met die velden leeg.
In dit geval zou het de volgende resultaat moeten leveren:
| Acties van gebruikers | ||
| Gebruiker | Titel actie | Datum |
| Gebruikertje | Actienieuw | 2007-07-21 10:30:00 |
| Hans | Actie nieuwste | 2007-11-15 13:00:00 |
| Kees | ||
Ik wil dit echter met 1 query doen, is dit mogelijk?
SQL:
1
2
3
4
| SELECT Gebruikers.Naam, Berichten.Titel, Berichten.Datum FROM gebruiker_berichten RIGHT JOIN Gebruikers ON gebruikers_acties.gebruikerID = Gebruikers.ID LEFT JOIN Acties ON gebruikers_acties.berichtID = Acties.ID |
Verder dan dat kom ik niet, omdat ik niet weet wat ik dan moet doen. Nu heb ik alle regels te pakken uit beide tabellen, maar ik wil voor elke gebruiker 1 regel en die zit ook nog aan een voorwaarde vast, namelijk dat het de laatste is, als die gesorteerd zou zijn op datum.
Hoe krijg ik dat dus voor elkaar in 1 query?
Ik doe nu dmv PHP 2 query's combineren. Dit gaat ook wel goed, maar ik wil de query kunnen ordenen vanuit de database. Dit heeft te maken met dat ik een abstractie laag gebruik met een datagrid. Ik wil die datagrid kunnen ordenen, maar die datagrid heeft ook nog paging. Dus ik wil onafhankelijk van die paging kunnen ordenen op alle pagina's. Maar het moet qua performance ook goed lopen bij 1000en records. Dus die paging moet al gebeuren bij de query (LIMIT enzo). Daarom wil ik het dus in 1 query regelen, want dan kan ik de ordening op beide tabellen gewoon in de query regelen.