login  Naam:   Wachtwoord: 
Registreer je!
 Forum

forum join

Offline Luc18 - 05/08/2011 16:36
Avatar van Luc18Onbekend Beste,

Ik ben bezig aan een nieuw forum systeem voor in mijn site.
Nu loop ik echter tegen 1 probleem aan:

je hebt het forum:
- hoofd categorie
- sub categorie
- topics
- reacties
- laatste reactie.

Van dit lijstje wil ik dus gegevens. dus bijvoorbeeld:

forum : PHP
php beginners 2 topics 10 reacties laatste reactie van: Luc in topic: 1 op: 05-08-2011

Zo wil ik het dus getoond hebben, maar ik krijg het niet voor elkaar om reacties te joinen met de juiste topics in de juiste categorie.

Het joinen van de topics is al wel gelukt. Maar dat met de reacties dus nog niet.

Zou iemand mij kunnen vertellen hoe ik dat zou moeten doen?

6 antwoorden

Gesponsorde links
Offline Stijn - 05/08/2011 16:59
Avatar van Stijn PHP expert Ik heb hier een probeersel voor je.

  1. SELECT count(t.*) AS aantal_topics, count(r.*)
  2. FROM categories AS c
  3. INNER JOIN topics AS t ON (c.id = t.cat_id)
  4. INNER JOIN reacties AS r ON (t.id = r.topic_id)
  5. WHERE c.id=...
  6. GROUP BY t.id


Die laatste reactie zal een aparte query worden.
Offline Luc18 - 05/08/2011 17:12 (laatste wijziging 05/08/2011 17:28)
Avatar van Luc18 Onbekend Ik snap je, maar het probleem is dat WHERE c.id = leeg is, omdat hij eerst alle query's bouwt (op jou manier) en dan gaat loopen.. Dus weet niet of het dan nog werkt?

Maar ik ga het even proberen:)

  1. dit is de code nu:
  2. SELECT forum.*, forum_categorie.*, fo_on.fo_on_id, IFNULL(fo_on.topics,0) AS topics, IFNULL(fo_re.reacties, 0) AS reacties
  3. FROM forum
  4. JOIN forum_categorie ON(forum.forum_id=forum_categorie.fo_ca_sub)
  5. LEFT JOIN (SELECT fo_on_id, fo_on_sub
  6. , COUNT(1) AS topics
  7. FROM forum_onderwerp
  8. GROUP BY
  9. fo_on_sub) fo_on
  10. ON (forum_categorie.fo_ca_id = fo_on.fo_on_sub)
  11. LEFT JOIN(SELECT fo_re_sub, count(1) AS reacties
  12. FROM forum_reacties
  13. GROUP BY fo_re_sub) fo_re
  14. ON (fo_on.fo_on_id=fo_re.fo_re_sub)
  15. ORDER BY forum_categorie.fo_ca_sub, forum_categorie.fo_ca_id ASC


Maar nu pakt hij de reacties niet goed.. Hij pakt de laatste reacties steeds, maar hij moet dus gaan tellen hoeveel reacties er bij ieder topic zijn in die categorie en die bij elkaar optellen..
Offline Giant - 07/08/2011 00:34
Avatar van Giant PHP beginner Dat komt omdat COUNT maar 1 maal draait. En dus maar 1 result oplevert. Zou die dit voor alle requests opnieuw doen gaat het heel wat resources kosten....
Offline Luc18 - 14/08/2011 12:39
Avatar van Luc18 Onbekend Hoe zou u dit dan doen? Want dit zie je op veel fora's maar ik zou geen idee hebben hoe dit goed zonder al te veel load gedaan kan worden?
Offline Thomas - 15/08/2011 00:32
Avatar van Thomas Moderator Je zou per topic het id / de datum van de laatste reactie in die tabel kunnen opslaan (volgens mij gebeurt iets soortgelijks op dit forum, tenzij dit inmiddels veranderd is). Als je joins gebruikt, is wellicht een LEFT JOIN beter dan een INNER JOIN, want als de laatste topic geen reactie heeft, levert dat in de query van Stijn volgens mij geen resultaat op, of je krijgt een resultaat wat je niet verwacht.

tl;dr: sla (semi) redundante informatie op in een hiërarchish hoger gelegen tabel. Als je er echt niet uitkomt / het qua performance beter is zou je er altijd voor kunnen kiezen om e.e.a. in een aparte tabel bij te houden, je hebt dan wel meer overhead (op een andere plaats en in een andere vorm ).
Offline MiST - 16/08/2011 16:36
Avatar van MiST Lid Moet toch in 1 query te doen zijn? gwn bottom up opbouwen, elk deeltje dat je nodig hebt en dan variabelen veranderen door verwijzingen naar andere velden. Gewoon altijd goed rekening houden met de dimensies van je (tussen)resultaten...

Heb even teveel hoofdpijn om de query zelf uit te schrijven, maar 'k kan u garanderen dat het wel wat lijnen zullen zijn .
Gesponsorde links
Je moet ingelogd zijn om een reactie te kunnen posten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.167s