[MySQL] Posts tellen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 13:08

Saven

Administrator

Topicstarter
Goedenacht Tweakers :P

Om meteen maar even met de deur in huis te vallen, ik heb het volgende script om informatie uit de database op te halen over een forum-post, en ik haal daar gelijk informatie op over het topic zelf en over het forum waar het in geplaatst is:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
    //----------------------------------------------------------------
    // Get forum-post info
    //----------------------------------------------------------------
    public function get_post_info($pid)
    {
        $query = $this->core->db->prepare
        ('
            SELECT
                p.pid as post_id, p.message, p.modbreak, p.use_emo, p.use_ubb,
                t.tid as topic_id, t.title, COUNT(p.pid) as total_posts, t.status,
                f.name as forum_name, f.id as forum_id
            FROM
                forum_posts p
            JOIN
                forum_topics t
            ON
                (t.tid = p.tid)
            JOIN
                forums f
            ON
                (f.id = t.fid)
            WHERE
                p.pid = :post_id
            GROUP BY
                p.tid
            LIMIT
                1
        ');
        
        $query->bindParam(':post_id', $pid, PDO::PARAM_INT);
        
        $query->execute();
        
        if( $query->rowCount() == 0 )
        {
            return false;
        }
        else
        {
            return $query->fetch(PDO::FETCH_ASSOC);
        }
    }


Nu wil ik ook om een bepaalde reden weten hoeveel posts het topic al heeft waarin gereageerd wordt. Ik dacht eerst handig te zijn met
MySQL:
1
COUNT(p.pid) as total_posts

Maar helaas toen ik wat verder doordacht leek mij dit onmogelijk.
Ik tel namelijk de posts van de geselecteerde post, en dat is er maar 1 :+ Ophalen via het topic_id en zo de query een beetje te herschrijven gaat hem ook niet worden omdat ik nog niet over het topic id beschik.

Kan iemand mij uit de brand helpen? Ik kan zelf namelijk geen oplossing hiervoor bedenken op een extra query na. En extra queries hebben we liever niet :P

Alvast bedankt :)

Acties:
  • 0 Henk 'm!

  • disjfa
  • Registratie: April 2001
  • Laatst online: 03-07 14:47

disjfa

be

Je haalt het op aan de hand van de post. Dus dat is er een, logisch. Haal de zooi eens op aan de hand van een topic ;) Of probeer een creatieve manier om de posts er nog een keer bij te joinen, maar dan zou ik eerder voor een extra query gaan. Anders word het onoverzichtelijk.

disjfa - disj·fa (meneer)
disjfa.nl


Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Staan die counts niet al in je forum/topic-tabel? Beetje forum heeft dat wel.

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 13:08

Saven

Administrator

Topicstarter
disjfa schreef op maandag 28 december 2009 @ 00:31:
Je haalt het op aan de hand van de post. Dus dat is er een, logisch. Haal de zooi eens op aan de hand van een topic ;) Of probeer een creatieve manier om de posts er nog een keer bij te joinen, maar dan zou ik eerder voor een extra query gaan. Anders word het onoverzichtelijk.
Hm de posts nog eens te joinen is inderdaad wel een goede, daar had ik nog niet aan gedacht.

Maar weet je toevallig wat in zo'n geval efficiënter/sneller is? Een join of een extra query :P
GlowMouse schreef op maandag 28 december 2009 @ 00:32:
Staan die counts niet al in je forum/topic-tabel? Beetje forum heeft dat wel.
Helaas (nog) niet :P Bezig met nieuwe forumsoftware schrijven die dat uiteindelijk wel zal hebben. Maar dan nog vind ik dat enigszins onbetrouwbaar. Stel dat er een keer iets mis gaat bij het syncen van dat veld, dan klopt er straks ergens iets niet meer :P

[ Voor 28% gewijzigd door Saven op 28-12-2009 00:35 ]


Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Saven schreef op maandag 28 december 2009 @ 00:33:

Maar weet je toevallig wat in zo'n geval efficiënter/sneller is? Een join of een extra query :P
Doe eens gek en meet/benchmark/test het :? Knock yourself out!

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • marco_balk
  • Registratie: April 2001
  • Laatst online: 20-06 21:52
Ik zou in zo'n geval wel een extra query willen. Zolang de indices in de tabellen goed staan, zal zo'n count sneller zijn dat het ophalen van een post met data.

Acties:
  • 0 Henk 'm!

  • Saven
  • Registratie: December 2006
  • Laatst online: 13:08

Saven

Administrator

Topicstarter
Hm thanks marco ik ga even kijken :)

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Je kunt het best die postcount gewoon in de row van je topic bijhouden (was al min of meer gezegd). Gewoon een vorm van caching die je een hoop resources besparen. Komt er een post bij of verwijder je een post? Dan update je de postcount in je topic row :)

Acties:
  • 0 Henk 'm!

  • Gomez12
  • Registratie: Maart 2001
  • Laatst online: 17-10-2023
Cartman! schreef op maandag 28 december 2009 @ 19:41:
Je kunt het best die postcount gewoon in de row van je topic bijhouden (was al min of meer gezegd). Gewoon een vorm van caching die je een hoop resources besparen. Komt er een post bij of verwijder je een post? Dan update je de postcount in je topic row :)
Het enige wat je wel in je achterhoofd moet houden is dat je periodiek de postcounts moet checken of herberekenen. Geen ramp opzich, maar je meot het wel even meenemen. Zeker in het begin...

Postcounts hebben nog al eens de neiging om foutief te gaan lopen als mensen handmatige db-acties doen of nieuwe programmatuur testen

Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Kun je gewoon een counterscriptje voor maken voor als je denkt dat het niet klopt (zit in MyReact/React ook zover ik weet).
Pagina: 1