[geeklog-devel] Bug and fix in What's New routine...
Rob Griffiths
webteam at macosxhints.com
Wed Feb 19 08:35:20 EST 2003
First, a >HUGE< thanks to Marc for taking the better part of an hour or
so yesterday to help debug this one! After my 1.3.7 upgrade went live
on Sunday afternoon, all looked good. But a couple of days later, I
noticed that the What's New box didn't appear to be sorting correctly,
and comments I knew I had added recently weren't showing up. I
compared the box contents with a selection from the COMMENTS table
sorted by date, and sure enough, many comments were missing.
After much futzing with various queries from Marc as he debugged this
one, it appears that if you have a few stories with many comments, the
original SQL will not select a large enough sample to get the 15 most
recent comments (or something like that; we could get it working by
expanding the size of the "LIMIT" statement). Marc re-wrote the query
in an absolute manner, and all I've done is insert the proper variable
substitutions. I haven't even bothered to line break it and make it
pretty, but it definitely works -- my What's New block now matches the
comments table sorted by date posted.
In lib-common.php, the original query is:
$sql = "SELECT DISTINCT count(*) AS
dups,type,question,{$_TABLES['stories']}.title,{$_TABLES['stories']}.sid
,qid "
. "FROM {$_TABLES['comments']} LEFT JOIN {$_TABLES['stories']} ON
(({$_TABLES['stories']}.sid = {$_TABLES['comments']}.sid) AND (" .
$stsql . ")) "
. "LEFT JOIN {$_TABLES['pollquestions']} ON ((qid =
{$_TABLES['comments']}.sid) AND (" . $posql . ")) WHERE (";
$sql .= "{$_TABLES['comments']}.date >= (NOW() - INTERVAL
{$_CONF['newcommentsinterval']} SECOND)) AND ((" . $stwhere . ") OR ("
. $powhere . "))";
$sql .= " GROUP BY {$_TABLES['comments']}.sid ORDER BY
{$_TABLES['comments']}.date DESC LIMIT 25";
Marc' re-written query is:
$sql = "SELECT DISTINCT count(*) AS dups, type, question,
{$_TABLES['stories']}.title, {$_TABLES['stories']}.sid, qid,
max(comments.date) as lastdate FROM {$_TABLES['comments']} LEFT JOIN
{$_TABLES['stories']} ON (({$_TABLES['stories']}.sid =
{$_TABLES['comments']}.sid) AND ({$stsql})) LEFT JOIN
{$_TABLES['pollquestions']} ON ((qid = {$_TABLES['comments']}.sid) AND
(({$posql}))) WHERE ({$_TABLES['comments']}.date >= (NOW() - INTERVAL
{$_CONF['newcommentsinterval']} SECOND)) AND ((({$stwhere})) OR
(({$powhere}))) GROUP BY {$_TABLES['comments']}.sid ORDER BY 7 DESC
LIMIT 25";
If someone could clean up the formatting and get this into the next
minor update, it'd be greatly appreciated.
Thanks again, Marc!
-rob.
More information about the geeklog-devel
mailing list