Re: complicated query (newbie..) - Mailing list pgsql-general

From Marcin Krol
Subject Re: complicated query (newbie..)
Date
Msg-id 49DE2A7B.30705@gmail.com
Whole thread Raw
In response to Re: complicated query (newbie..)  (Sam Mason <sam@samason.me.uk>)
Responses Re: complicated query (newbie..)
Re: complicated query (newbie..)
List pgsql-general
Hello Sam,

Thanks a million for reply! I'm so frustrated with this..

Sam Mason wrote:
> On Thu, Apr 09, 2009 at 06:08:04PM +0200, Marcin Krol wrote:
>> What I'm trying to accomplish is producing list of hosts available
>> within a specified timeframe.
>>
>> What I have is a table of hosts, table of reservations (containing id,
>> start_date and end_date) and an association table reservation_hosts.
>>
>> I need a list of hosts, with accompanying reservations fulfilling
>> certain (date-related) conditions.
>>
>> But there are two twists:
>>
>> - if host has reservation(s), but those do not fulfill the date
>> conditions (the host is not available within a specified timeframe), the
>> host obviously should NOT be listed
>>
>> - if host has no reservations at all, it obviously is available, so it
>> should be listed
>
> I think the following should do what you want.
>
>   SELECT h.id, r.id, r.start_date, r.end_date
>   FROM hosts h
>     LEFT JOIN (reservation_hosts m INNER JOIN reservation r
>         ON m.reservation_id = r.id
>         AND (r.start_date,r.end_date) OVERLAPS (${window_start},${window_end})
>       ON h.id = m.host_id
>   WHERE h.id NOT IN (
>     SELECT m.host_id
>     FROM reservation r, reservation_hosts m
>     WHERE r.id = m.reservation_id
>       AND m.host_id IS NOT NULL
>       AND (r.start_date,r.end_date) OVERLAPS (${requested_start},${requested_end})
>   ORDER BY h.id, r.start_date)
>
> The formatting is somewhat grim, but I think it should do what you want.

Well it almost works: I see that it selects out the host ids whose date
conditions are not met (while adding those that have no reservations),
but why it produces nothing but NULLs in place of values, even for hosts
who do have reservations but ones ?!

id    id    start_date    end_date
4
    NULL    NULL    NULL
5
    NULL    NULL    NULL
6
    NULL    NULL    NULL
7
    NULL    NULL    NULL
8
    NULL    NULL    NULL
9
    NULL    NULL    NULL
10
    NULL    NULL    NULL
11
    NULL    NULL    NULL
12
    NULL    NULL    NULL
13
    NULL    NULL    NULL




I had to edit it a bit: it seems there was one parentheses missing after
first subquery:

   SELECT h.id, r.id, r.start_date, r.end_date
   FROM hosts h
     LEFT JOIN (reservation_hosts m INNER JOIN reservation r
         ON m.reservation_id = r.id AND r.start_date  > 2009-04-09)
       ON h.id = m.host_id
   WHERE h.id NOT IN (
     SELECT m.host_id
     FROM reservation r, reservation_hosts m
     WHERE r.id = m.reservation_id
       AND m.host_id IS NOT NULL
       AND r.start_date > 2009-04-09
   ORDER BY h.id, r.start_date)

Two things:

- If I quote date values like '2009-04-09' it doesn't work again! I.e.
result set includes one host id that should have been excluded (bc it
has reservation whose date doesn't match the condition)

- I have replaced OVERLAPS with explicit date condition bc PG complained:

ERROR:  function pg_catalog.overlaps(date, date, integer, integer) does
not exist
HINT:  No function matches the given name and argument types. You may
need to add explicit type casts.








pgsql-general by date:

Previous
From: Thomas Kellerer
Date:
Subject: Some suggestions for the non Linux installers
Next
From: Steve Atkins
Date:
Subject: Re: Storing HTML: HTML entities being rendered in that raw form