Toon posts:

[PHP & MYSQL] Dubbele query: 1 van maken

Pagina: 1
Acties:
  • 266 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Hoi allemaal!

Ik ben weer wat aan het php'en geraakt :) Veel kan ik er nog niet van enzo, maar het begint toch al aardig op te schieten vind ik. Maar ik zit met een "efficiëntie"-probleempje. Het zit zo:

Ik heb een tabel, userlist, met daarin informatie over de forum-gebruikers. Een record daaruit is het "userid", dat elke gebruiker uniek maakt.
Daarnaas heb ik een tabel, forumposts, met alle postjes die er op het forum geplaatst zijn. Daarin heb ik een record "author". In author zitten dus de userids, uit userlist.

Nu heb ik de volgende query:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?
$query = "SELECT * FROM forumposts WHERE replytoid=0 &amp;amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp;amp; forumid='$fid' ORDER by datetime DESC";
$result = mysql_query($query);
while ($row = mysql_fetch_array($result)) { 
    $postid = $row["postid"];
    $topic = $row["topic"];
    $useridnr = $row["author"];
    $datetime = $row["datetime"]; $datum = date("j F Y, H:i", strtotime($datetime));

    $query4 = "SELECT username FROM userlist WHERE userid='$useridnr'";
    $result4 = mysql_query($query4);
    $row4 = mysql_fetch_row($result4);
    $author = $row4[0];

        etc...
}
?>

In de eerste query ga ik dus alle informatie (titel, author, .. en van die zaken) halen. Maar bij $row["author"] krijg ik dus een getal, die het userid voorstel van de poster. In de tweede query ga ik dat getal "omzetten" (associëren zeg maar) in de echte naam van de poster.

Mijn vraag is: kan dit korter? Want ik heb nu al 4 queries voor het uithalen van alle posten, en dat vind ik wat veel. Namelijk:
· die 2 queries die je boven ziet
· het aantal replies op een thread opvragen
· datum opvragen wanneer het gebruiker thread x bezocht heeft, zodat ik kan zeggen of de thread geupdate is ja of nee.

Zal wel lukken zo? :o :D

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:57
Ik denk dat je in een SQL manual eens iets moet gaan lezen over joins.
Hiermee kun je gegevens uit verschillende tabel halen door middel van 1 query.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ff alle queries erbij gezet, je weet maar nooit wat voor schitterende ideëen jullie nog hebben :)
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
<?
$query = "SELECT * FROM forumposts WHERE replytoid=0 &amp;&amp; forumid='$fid' ORDER by datetime DESC";
$result = mysql_query($query);
while ($row = mysql_fetch_array($result)) { 
    $postid = $row["postid"];
    $topic = $row["topic"];
    $useridnr = $row["author"];
    $datetime = $row["datetime"]; $datum = date("j F Y, H:i", strtotime($datetime));
    
    $query2 = "SELECT count(*) FROM forumposts WHERE replytoid='$postid'";
    $result2 = mysql_query($query2);
    $aantal_replies = mysql_result($result2,"0");
    
    $query2 = "SELECT username FROM userlist WHERE userid='$useridnr'";
    $result2 = mysql_query($query2);
    $row2 = mysql_fetch_row($result2);
    $author = $row2[0];
    
    $query2 = "SELECT datetime FROM threadvisits WHERE threadid='$postid' &amp;&amp; userid='$userid'";
    $result2 = mysql_query($query2);
    $row2 = mysql_fetch_row($result2);
    $threadvisit = $row2[0];
    
... uitprinten van de hele zooi
}
?>

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:57
Even vlug ge-googled en de eerste de beste link genomen:

http://www.1keydata.com/sql/sql9.html

https://fgheysels.github.io/


Verwijderd

Topicstarter
Op vrijdag 01 februari 2002 19:35 schreef whoami het volgende:
Even vlug ge-googled en de eerste de beste link genomen:

http://www.1keydata.com/sql/sql9.html
Aaah oops, ik had jou eerste reply niet gezien (snelle reply man! :7 ).. Ik ga die link onmiddellijk bekijken! Bedankt trouwens.

Verwijderd

FF een tip: beter wat meer makkelijke queries dan 1 moeilijke query met een hoop joins

Verwijderd

Topicstarter
Op vrijdag 01 februari 2002 21:00 schreef TimD het volgende:
FF een tip: beter wat meer makkelijke queries dan 1 moeilijke query met een hoop joins
Hoe bedoel je? Die snap ik niet goed? 1 query zal toch sneller zijn dan meerdere queries?

  • Killemov
  • Registratie: Januari 2000
  • Laatst online: 11-09 10:38

Killemov

Ik zoek nog een mooi icooi =)

Op vrijdag 01 februari 2002 21:00 schreef TimD het volgende:
FF een tip: beter wat meer makkelijke queries dan 1 moeilijke query met een hoop joins
In dit geval (php + mysql + situatie) kan ik me dat wel voorstellen. Met een goed (O/R)DBMS kun je beter de queries zo vet mogelijk maken. Daar is het ding namelijk voor gemaakt!.

Hey ... maar dan heb je ook wat!


Verwijderd

Topicstarter
Op vrijdag 01 februari 2002 21:11 schreef Killemov het volgende:

[..]

In dit geval (php + mysql + situatie) kan ik me dat wel voorstellen. Met een goed (O/R)DBMS kun je beter de queries zo vet mogelijk maken. Daar is het ding namelijk voor gemaakt!.
Kan je dat even verduidelijken?

Trouwens, ik kom niet goed uit die joins.. zelfs als ik het goed snap, kan ik precies 'al' die queries in 1 zetten? Kom er wel niet goed uit zo :(

Verwijderd

Beter 1 grote query dan een hele lijst kleine. Echt moeilijker is het niet en het bespaard je een hoop moeite. Dbms optimaliseerd je query en je eigen code een stuk compacter. Queries met joins, etc, zijn juist de zaken waarvoor SQL gemaakt is...

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:57
Op vrijdag 01 februari 2002 21:08 schreef DiEana het volgende:

[..]

Hoe bedoel je? Die snap ik niet goed? 1 query zal toch sneller zijn dan meerdere queries?
Inderdaad, het DBMS zal uw query zodanig optimaliseren dat er zoveel mogelijk gebruik gemaakt wordt van indexen.
Meerdere queries zijn misschien wel duidelijker leesbaar, maar ik vind 1 query toch in de meeste gevallen het best.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Ah, toch :)

Kan iemand mij een voorbeeld geven van die "joins", want de query in phpmyadmin invullen lukt wel (ik krijg wat ik wil zien), maar als ik dan echo $author; doe, krijg ik de naam niet te zien? Hoe haal ik de info dan eruit?

Verwijderd

Probeer dit eens.

SELECT * FROM forumposts f, userlist u WHERE replytoid=0 forumid='$fid' and f.author = u.userid ORDER by datetime DESC

of probeer deze outer join.

SELECT * FROM forumposts f, LEFT JOIN userlist u on f.author = u.userid WHERE f.replytoid=0 and f.forumid='$fid' ORDER by datetime DESC

uit de losse pols gedaan, dus het kan zijn dat het niet werkt.

  • jelmervos
  • Registratie: Oktober 2000
  • Niet online

jelmervos

Simple user

En hoe zit het dan met een join naar een tabel waar meerdere records uit moeten komen.
Bijvoorbeeld een table facturen en factuurregels (waar de artikelen van een factuur in staan). Kan dat dan ook in 1 query, of moet je per factuur de tabel factuurregels query-en voor de regels op die factuur?

"The shell stopped unexpectedly and Explorer.exe was restarted."


  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
Op zaterdag 02 februari 2002 19:29 schreef jelmervos het volgende:
En hoe zit het dan met een join naar een tabel waar meerdere records uit moeten komen.
Bijvoorbeeld een table facturen en factuurregels (waar de artikelen van een factuur in staan). Kan dat dan ook in 1 query, of moet je per factuur de tabel factuurregels query-en voor de regels op die factuur?
Tuurlijk kan dat in 1 query.. in je loop check je dan of je te maken hebt met een nieuwe factuur, en dan druk je daarvan een kopje af, als het nog de oude factuur is dan druk je alleen de factuurregel af.
uitgebreidere uitleg in de vele 'forum+catagorie-listing in 1 query'-topics..

Verwijderd

Topicstarter
Op zaterdag 02 februari 2002 17:42 schreef RealGamer het volgende:
Probeer dit eens.
...
Bedankt!

Zo heb ik het nu, en het werkt, kan het "nog" korter?
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
<?
$query = "SELECT forumposts.postid,forumposts.topic,forumposts.datetime,userlist.username
      FROM forumposts, userlist
      WHERE replytoid=0 &amp;amp;amp;amp;&amp;amp;amp;amp; forumid='$fid' &amp;amp;amp;amp;&amp;amp;amp;amp; forumposts.author = userlist.userid
      ORDER by datetime DESC
     ";
$result = mysql_query($query);
while ($row = mysql_fetch_array($result)) { 
    $postid = $row["postid"];
    $topic = $row["topic"];
    $author = $row["username"];
    $datetime = $row["datetime"]; $datum = date("j F Y, H:i", strtotime($datetime));
    
    $query2 = "SELECT count(*) FROM forumposts WHERE replytoid='$postid'";
    $result2 = mysql_query($query2);
    $aantal_replies = mysql_result($result2,"0");
    
    $query2 = "SELECT datetime FROM forumposts WHERE replytoid='$postid' ORDER BY datetime DESC LIMIT 1";
    $result2 = mysql_query($query2);
    $row2 = mysql_fetch_array($result2);
    $datumlaatstereply = $row2[0];
    
    $query2 = "SELECT datetime FROM threadvisits WHERE threadid='$postid' &amp;amp;amp;amp;&amp;amp;amp;amp; userid='$userid'";
    $result2 = mysql_query($query2);
    $row2 = mysql_fetch_row($result2);
    $threadvisit = $row2[0];
    ?>
... ik gebruik verder ook if (mysql_affected_rows() == 0) die terug slaat op de laatste $query2 om te zien of er ook geen datum (dus de thread is nog niet bezocht geweest) gevonden is. --> ook als "not yet visited" beschouwen. Dus die moet ik ook behouden.
?>

Want al die queries komen de snelheid toch niet tengoede ..

Volgens mij moet het trouwens korter kunnen, want ik haal 2 keer van de 3 queries iets uit forumposts, en dat doe ik in de hoofdquery (de bovenste dus) ook.. alleen ben ik wat in de knoei met die "dubbele" WHERE clauses, omdat het de ene keer WHERE replytoid = 0 moet zijn, en de andere keer WHERE replytoid = '$postid' om het aantal replies op te vragen.

Verwijderd

Topicstarter
niemand? Ja toch? :7

  • bartvb
  • Registratie: Oktober 1999
  • Laatst online: 14:56
Ja, tuurlijk kan dat korter. In heel die while loop heb je niet 1 SELECT nodig.. Lees nou aub eerst eens even wat documentatie over SQL en zorg dat je dat ook snapt. Er zijn echt 1001 tutorial inclusief uitgebreide voorbeelden..

Wat betreft dat '1 vette query is beter dan meerdere queries' daar ben ik het dus niet mee eens, ook niet met een 'echte' RDBMS..

Het is zeker wel waar dat je RDBMS je query gaat optimaliseren maar jij kan in je query niet altijd perfect aangeven wat je nou precies wel/niet wil hebben en op welke manier..

Een looping query (zoals boven) is echt zwaaaaaar bagger en ja in zo'n geval is 1 complexe query VEEL sneller, maar dat is dus zeker niet per definitie waar..

Verwijderd

Topicstarter
Op zondag 03 februari 2002 18:02 schreef bartvb het volgende:
Ja, tuurlijk kan dat korter. In heel die while loop heb je niet 1 SELECT nodig.. Lees nou aub eerst eens even wat documentatie over SQL en zorg dat je dat ook snapt. Er zijn echt 1001 tutorial inclusief uitgebreide voorbeelden..

...
Hoezo ik heb niet 1 SELECT nodig? Hoe ga ik dan alles uit de dbase halen?

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:57
Op zondag 03 februari 2002 18:02 schreef bartvb het volgende:
Lees nou aub eerst eens even wat documentatie over SQL en zorg dat je dat ook snapt. Er zijn echt 1001 tutorial inclusief uitgebreide voorbeelden..
Hier ben ik het volledig mee eens. Je hebt nu 2 of zelfs 3 dagen zitten wachten op een oplossing, terwijl, als je wat meer moeite genomen had even een SQL-tutorial had gevonden en in die 2 of 3 dagen had je dan al heel wat van SQL opgestoken en oa uw probleem zelf opgelost.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Op zondag 03 februari 2002 21:57 schreef whoami het volgende:

[..]

Hier ben ik het volledig mee eens. Je hebt nu 2 of zelfs 3 dagen zitten wachten op een oplossing, terwijl, als je wat meer moeite genomen had even een SQL-tutorial had gevonden en in die 2 of 3 dagen had je dan al heel wat van SQL opgestoken en oa uw probleem zelf opgelost.
Neen hoor, ik heb hier "niet op zitten wachten", ik ben van goede wil, of je het nu gelooft of niet. Maar ik vind het altijd leuk om alternatieve oplossingen te bekijken, en zo de voordelen en de nadelen ervan af te wikken. En dit vooral als er gezegd wordt "maar dit heb je toch helemaal niet nodig", want dan begin je jezelf toch wel vragen te stellen (logisch toch?).
Ik ben me zeer goed bewust van de rules, en scriptrequest is het laatste waar ik mezelf zal aan zondigen.

Sluit het topic maar anders, het is een beetje verspoort als je't mij vraagt.

  • brammetje
  • Registratie: Oktober 2000
  • Laatst online: 12-01-2025
ga naar www.sqlcourse2.com , lees de tutorial over joins, schrijf je querie en klaar :)

en eigenlijk mag dit topic wel dicht, het onderwerp join is al zovaak aan bod gekomen :(

Verwijderd

Topicstarter
Op zondag 03 februari 2002 22:26 schreef brammetje het volgende:
ga naar www.sqlcourse2.com , lees de tutorial over joins, schrijf je querie en klaar :)

en eigenlijk mag dit topic wel dicht, het onderwerp join is al zovaak aan bod gekomen :(
Bedankt en Akkoord en Sorry

:7

Verwijderd

Topicstarter
Ik heb weer wat gelezen van MYSQL over JOINS ... moet toegoegen: ik had het op het begin moeten doen :)

Maar nu zit ik vast met deze query, hij wil niet, en volgens mij is hij wel juist?
PHP:
1
2
3
4
5
6
7
8
9
10
<?
$intime =  strtotime ("-2 week");
$vergelijktijd = date("Y-m-d H:i:s", $intime);
$query = "SELECT count(forumposts.postid) AS aantal_replies,forumposts.postid,forumposts.topic,userlist.username, forumposts.closed, forumposts.lastreply
      FROM forumposts, userlist
      LEFT JOIN forumposts ON forumposts.replytoid = forumposts.postid
      WHERE replytoid=0 and forumid='$fid' and forumposts.author = userlist.userid and forumposts.lastreply > '$vergelijktijd'
      ORDER by closed,lastreply DESC
     ";
?>

Ziet iemand de fout?

Verwijderd

Topicstarter
^^ kick (24 uur :))

Ik kom nog altijd niet uit die query.. volgens mij ligt de fout aan die count(...), maar ik weet niet wat?

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:57
sorry hoor, maar ik kan die code hier moeilijk lezen. In fact doe ik zelfs geen moeite meer om code te lezen die tussen php-tags staat, m'n ogen doen er pijn van. Kun je die php-tags even vervangen door code-tags?

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:57
Trouwens, welke fout krijg je? Ik lees dat je een count gebruikt. Krijg je een fout ivm aggregate functions ofzo? Dan is het goed mogelijk dat je uw GROUP BY clause vergeten bent....Toch nog maar es even die SQL manual/tutorial erbij nemen? :)

https://fgheysels.github.io/


  • mEdnass
  • Registratie: November 2001
  • Laatst online: 04-12-2021
Op maandag 11 februari 2002 22:15 schreef whoami het volgende:
sorry hoor, maar ik kan die code hier moeilijk lezen. In fact doe ik zelfs geen moeite meer om code te lezen die tussen php-tags staat, m'n ogen doen er pijn van. Kun je die php-tags even vervangen door code-tags?
Sorry hoor, ff geheel off-topic, maar je kan in IE, of welke browser dan ook de text-grootte omhoog schroeven... |:(

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:57
Op maandag 11 februari 2002 22:21 schreef mEdnass het volgende:

[..]

Sorry hoor, ff geheel off-topic, maar je kan in IE, of welke browser dan ook de text-grootte omhoog schroeven... |:(
Wel, sorry hoor, maar ik heb geen zin om dat te doen, gewoon maar om die code die tsn php tags staat te kunnen lezen. |:(

https://fgheysels.github.io/


  • mEdnass
  • Registratie: November 2001
  • Laatst online: 04-12-2021
Op maandag 11 februari 2002 22:21 schreef whoami het volgende:

[..]

Wel, sorry hoor, maar ik heb geen zin om dat te doen, gewoon maar om die code die tsn php tags staat te kunnen lezen. |:(
Dus omdat alleen jij er last van hebt, moet iedere lezer de code 2 keer lezen???(1x in php, wat makkelijk is dankzij de kleurtjes, en 1x in [ code ] voor jou?)

Zal er verder maar over ophouden, vraag de GoT mensen anders of ze hun stylesheets voor je willen aanpassen.

Verwijderd

Topicstarter
Inderdaad. Heb ff geprobeerd mooi onder elkaar te zetten
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
$intime =  strtotime ("-2 week");
$vergelijktijd = date("Y-m-d H:i:s", $intime);
$query = "  SELECT count(forumposts.postid) AS aantal_replies,
            forumposts.postid,forumposts.topic,
            userlist.username,
            forumposts.closed,
            forumposts.lastreply
        FROM forumposts,
             userlist
        LEFT JOIN forumposts ON forumposts.replytoid = forumposts.postid
        WHERE replytoid=0 and   
            forumid='$fid' and
            forumposts.author = userlist.userid and
            forumposts.lastreply > '$vergelijktijd'
        ORDER by closed, lastreply DESC
       ";

  • D2k
  • Registratie: Januari 2001
  • Laatst online: 31-08 10:19

D2k

Op maandag 11 februari 2002 22:24 schreef mEdnass het volgende:
Dus omdat alleen jij er last van hebt, moet iedere lezer de code 2 keer lezen???(1x in php, wat makkelijk is dankzij de kleurtjes, en 1x in [ code ] voor jou?)

Zal er verder maar over ophouden, vraag de GoT mensen anders of ze hun stylesheets voor je willen aanpassen.
lets kiss and make friends :)
whoami je kan het ook ff zoals ik altijd doe ff in je eigen editor bekijken
mEdnass die style sheets zijn niet aanpasbaar :)

Doet iets met Cloud (MS/IBM)


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:57
Inderdaad, je bent je GROUP BY vergeten. Je zult idd wel een fout krijgen dat je een aggregate column ofzo hebt (die count dus), en dat je die andere columns die je selecteert in een GROUP BY clause moet zetten.

Dus, voor je ORDER BY (die komt altijd laatst), voeg je een
code:
1
GROUP BY alle_columns_in_je_select_list_die_niet_aggr_zijn

https://fgheysels.github.io/


  • whoami
  • Registratie: December 2000
  • Laatst online: 22:57
Op maandag 11 februari 2002 22:24 schreef mEdnass het volgende:

[..]

Dus omdat alleen jij er last van hebt, moet iedere lezer de code 2 keer lezen???(1x in php, wat makkelijk is dankzij de kleurtjes, en 1x in [ code ] voor jou?)
Ja. >:)
Ik ben trouwens niet de enige die er last van heeft. En die kleurtjes vind ik trouwens niet makkelijker lezen. Die kleuren zijn echt bagger.
Zal er verder maar over ophouden, vraag de GoT mensen anders of ze hun stylesheets voor je willen aanpassen.
Ik denk ook dat het beter is, want jouw gezaag voegt echt niets toe aan dit topic. Ik heb het trouwens al gevraagd aan de GoT-crew en in het nieuwe forum zullen die php-tags wellicht aangepast zijn. :)

https://fgheysels.github.io/


Verwijderd

Topicstarter
Op maandag 11 februari 2002 22:16 schreef whoami het volgende:
Trouwens, welke fout krijg je? Ik lees dat je een count gebruikt. Krijg je een fout ivm aggregate functions ofzo? Dan is het goed mogelijk dat je uw GROUP BY clause vergeten bent....Toch nog maar es even die SQL manual/tutorial erbij nemen? :)
Deze fout krijg ik... ik wil altijd de manual doornemen, maar ik vind echt niet wat er mis is... dat is het hem nou net :\

"Warning: Supplied argument is not a valid MySQL result resource in d:\www\forum.php on line 53"

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:57
Op maandag 11 februari 2002 22:26 schreef D2k het volgende:

hoami je kan het ook ff zoals ik altijd doe ff in je eigen editor bekijken
Call me lazy...

https://fgheysels.github.io/


Verwijderd

Topicstarter
Sorry maar wat betekent "een aggregate column" ?

Ik veronderstel die forumposts.postid, maar als ik die toevoeg (GROUP BY forumposts.postid voorlaatste lijn dus): nog altijd error.

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:57
Die aggr. column is uw count(...) column. Die moet je dus niet in uw group by zetten, maar de andere columns wel.

Die fout die je krijgt zal wel op iets anders slaan, maar ik weet niet zo direct op wat. 'k Heb nl. geen ervaring met MySQL en weet dus niet welke keywords enzo hij wel en niet kent. /me vindt MySQL wel maar een slecht DBMS maar dit terzijde
Doch neemt dit niet weg dat je die group by er zeker bij moet zetten.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Op maandag 11 februari 2002 22:38 schreef whoami het volgende:
Die aggr. column is uw count(...) column. Die moet je dus niet in uw group by zetten, maar de andere columns wel.

Die fout die je krijgt zal wel op iets anders slaan, maar ik weet niet zo direct op wat. 'k Heb nl. geen ervaring met MySQL en weet dus niet welke keywords enzo hij wel en niet kent. /me vindt MySQL wel maar een slecht DBMS maar dit terzijde
Doch neemt dit niet weg dat je die group by er zeker bij moet zetten.
Ok, toch bedankt.

Ik heb ze erbij gezet.. zelfde resultaat..

/me snapt er even niets meer van :'(

Verwijderd

Gebruik eens mysql_error, geeft meestal wat meer info
PHP:
1
2
3
4
<?
$result = mysql_query($query)
   or die (mysql_error());
?>

Verder is je Query zonder GROUP BY gewoon niet compleet.
Probeer 'm eerst eens zonder COUNT() en GROUP BY.
Dan kun je kijken of die query wel goed gaat.

Moeilijke Queries test ik eerst altijd even uit met mysqlfront
op m'n lokale mysql-server

  • Martijn02
  • Registratie: September 2000
  • Laatst online: 09-09 11:37

Martijn02

/* No Comment */

Op maandag 11 februari 2002 22:25 schreef DiEana het volgende:
Inderdaad. Heb ff geprobeerd mooi onder elkaar te zetten
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$intime =  strtotime ("-2 week");
$vergelijktijd = date("Y-m-d H:i:s", $intime);
$query = "  SELECT count(forumposts.postid) AS aantal_replies,
            forumposts.postid,forumposts.topic,
            userlist.username,
            forumposts.closed,
            forumposts.lastreply
        FROM forumposts,     // <== Hier pak je iets uit de tabel forumposts
             userlist
        LEFT JOIN forumposts // <== En hier weer... Wrom?
              ON forumposts.replytoid = forumposts.postid
        WHERE replytoid=0 and   
            forumid='$fid' and
            forumposts.author = userlist.userid and
            forumposts.lastreply > '$vergelijktijd'
        ORDER by closed, lastreply DESC
       ";
zie mijn comments in je code

Verwijderd

Topicstarter
Op dinsdag 12 februari 2002 12:39 schreef Martijn02 het volgende:

[..]

zie mijn comments in je code
Omdat ik die forumposts "dubbel" moet gebruiken zeg maar. De ene keer moet "replytoid" gelijk zijn aan 0 (zet ik in de WHERE), maar om het aantal replies op te halen, moet ik alle forumposten afhalen, waar "replytoid" gelijk is aan de hoofdpostn, dus daarom die LEFT JOIN.

Verwijderd

Topicstarter
Op dinsdag 12 februari 2002 11:22 schreef peidor het volgende:
Gebruik eens mysql_error, geeft meestal wat meer info
PHP:
1
2
3
4
<?
$result = mysql_query($query)
   or die (mysql_error());
?>

Verder is je Query zonder GROUP BY gewoon niet compleet.
Probeer 'm eerst eens zonder COUNT() en GROUP BY.
Dan kun je kijken of die query wel goed gaat.

Moeilijke Queries test ik eerst altijd even uit met mysqlfront
op m'n lokale mysql-server
Heb even dat programmatje gedownload (lekkur handig man, thanks :7). Zonder in de SELECT: "count(forumposts.postid) AS aantal_replies," en de "LEFT JOIN forumposts ON forumposts.replytoid = forumposts.postid" doet hij het wel, maar dan weet ik dus niet het aantal replies op de hoofdpost. (weet ik wel: ik kan een aparte query maken, maar dat wil ik nu net niet, omdat het trager gaat zo, zie topic).

  • Martijn02
  • Registratie: September 2000
  • Laatst online: 09-09 11:37

Martijn02

/* No Comment */

Ja maar hoe weet je dan welke 'forumposts' je bedoeld ? bij de select of bij de where? De database snapt het zo niet hoor...

Verder zou ik geen combinatie maken van die 2 soorten joins, da's zo onoverzichtelijk.

Ik zou iets in deze richting bedenken
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$intime =  strtotime ("-2 week");
$vergelijktijd = date("Y-m-d H:i:s", $intime);
$query = "  SELECT count(replies.postid) AS replies,
            forumposts.postid,forumposts.topic,
            userlist.username,
            forumposts.closed,
            forumposts.lastreply
        FROM forumposts,
        LEFT JOIN forumposts AS replies 
            ON forumposts.replytoid = replies.postid
        LEFT JOIN userlist 
             ON forumposts.author = userlist.userid 

        WHERE forumposts.replytoid=0
        AND forumposts.forumid='$fid'
        AND forumposts.forumposts.lastreply > '$vergelijktijd'
        GROUP BY forumposts.replytoid
        ORDER BY closed, lastreply DESC";

Succes!

/edit kleine aanpassing sql code

Verwijderd

Topicstarter
Deze query heb ik nu:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT count(forumposts.postid) AS aantal_replies,
            forumposts.postid,forumposts.topic,
            userlist.username,
            forumposts.closed,
            forumposts.lastreply
        FROM forumposts
        LEFT JOIN userlist
            ON forumposts.author = userlist.userid
        LEFT JOIN forumposts AS aantal_replies
            ON forumposts.replytoid = forumposts.postid
        WHERE forumposts.replytoid=0
            AND forumposts.forumid='$fid'
        AND forumposts.lastreply > '$vergelijktijd'
        GROUP BY forumposts.forumid
        ORDER BY closed, lastreply DESC

Hier laat hij alleen de eerste post zien die er gepost is op dat forum, en als aantal_replies zegt hij het totaal aantal posts gedaan op dat forum?

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:57
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
SELECT count(forumposts.postid) AS aantal_replies,
            forumposts.postid,forumposts.topic,
            userlist.username,
            forumposts.closed,
            forumposts.lastreply
        FROM forumposts
        LEFT JOIN userlist
            ON forumposts.author = userlist.userid
        LEFT JOIN forumposts AS aantal_replies
            ON forumposts.replytoid = forumposts.postid
        WHERE forumposts.replytoid=0
            AND forumposts.forumid='$fid'
        AND forumposts.lastreply > '$vergelijktijd'
            GROUP BY forumposts.forumid, 
                 forumposts.topic,
                 userlist.username,
              forumposts.closed,
             forumposts.lastreply

        ORDER BY closed, lastreply DESC

https://fgheysels.github.io/


Verwijderd

Topicstarter
bedankt!

Nu is wel de opzet mislukt: ik wou het sneller doen runnen.. nu duurt het laden van 40/50 threads +/- 0.3/0.4 seconden trager.. :(

2 queries sneller dan 1 grote?

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:57
Bekijk eens of je wel optimaal gebruik maakt van alle queries, of als je bepaalde queries anders moet leggen.
Het veranderen van de volgorde van de voorwaarden in uw WHERE clausule kan soms ook wel prestatie-winst (of verlies) opleveren.

Bekijk dus even het execution plan van die query. Hoe je dat doet bij MySQL -> I don't know.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Op donderdag 14 februari 2002 19:18 schreef whoami het volgende:
Bekijk eens of je wel optimaal gebruik maakt van alle queries, of als je bepaalde queries anders moet leggen.
Het veranderen van de volgorde van de voorwaarden in uw WHERE clausule kan soms ook wel prestatie-winst (of verlies) opleveren.

Bekijk dus even het execution plan van die query. Hoe je dat doet bij MySQL -> I don't know.
OK, ga ik zeker doen! En nogmaals: bedankt, erg bedankt :7

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:57
Op donderdag 14 februari 2002 20:18 schreef DiEana het volgende:

OK, ga ik zeker doen! En nogmaals: bedankt, erg bedankt :7
you're welcome. :)

https://fgheysels.github.io/


  • Poiter
  • Registratie: Juli 2001
  • Laatst online: 20-02 14:54
Klopt, die count() is het probleem. Het resultaat van die count levert namelijk 1 regel op, terwijl de rest van de selectie meerdere regels oplevert. Dit botst dus. het ligt eraan wat je wilt het aantal counts totaal per regel, of het aantal counts per selectie. In het eerste geval kun je een inline select gebruiken, in het tweede geval moet je een group by gebruiken. Voorbeeldje :

1) Select (select count( * ) from forumposts), username from forumposts
where ......;

2) select count( * ), username from forumposts
where ....
group by username;


[discussiemode]
Trouwens, als performance geen issue is kun je het beste voor onderhoudbaarheid gaan. Dus simpele queries heeft de voorkeur boven complexe queries. Een database is primair voor het opslaan van data en pas op de tweede plaats komt het combineren en spelen met deze data.
[/discussiemode]

  • whoami
  • Registratie: December 2000
  • Laatst online: 22:57
Op donderdag 14 februari 2002 21:22 schreef Poiter het volgende:
[discussiemode]
Trouwens, als performance geen issue is kun je het beste voor onderhoudbaarheid gaan. Dus simpele queries heeft de voorkeur boven complexe queries. Een database is primair voor het opslaan van data en pas op de tweede plaats komt het combineren en spelen met deze data.
[/discussiemode]
Daar ben ik het nu eens niet mee eens. Een DB is primair om er gegevens in te steken en primair om er gegevens uit te halen. Een datawarehouse is er primair om gegevens uit te halen.

https://fgheysels.github.io/


Verwijderd

Topicstarter
Op donderdag 14 februari 2002 21:22 schreef Poiter het volgende:
Interessante uitleg
Morgen eens proberen, ik zal de verschillen ook rapporteren! :)
Pagina: 1