On Sun, Sep 7, 2008 at 6:09 AM, Gregory Stark <stark@enterprisedb.com> wrote:
> "Uwe C. Schroeder" <uwe@oss4u.com> writes:
>
>> I want to get a list looking like
>>
>> forum id thread_id post_id
>> 1 6 443
>> 2 9 123
>> 3 3 557
> ...
>> It all boils down to me not being able to come up with a query that gives me
>> the latest post per forum_id.
>
> In a situation like this I would probably denormalize the tables slightly by
> adding a form_id key to the individual posts. That would make it hard to ever
> move a thread from one forum to another, though not impossible, but would help
> in this case as well as any other time you want to do an operation on all
> posts in a forum regardless of thread.
<sql guru hat on>
select f.*,
(
select (t,
(
select p from post p
where p.thread_id = t.thread_id
order by post_id desc limit 1
))
from thread t
where forum_id = f.forum_id
order by thread_id desc limit 1
) as threadpost
from forum f;
:-)
'thread post' is a nested composite, ((thread), post).
The above will pretty much guarantee a fast query unless the number of
forums is large. To pull out the composite fields, wrap in a subquery
or (better yet) fire up libpqtypes.
merlin