[SQL] SQL Statement Help needed

2005-12-04 Thread Michael Avila
I am not much of a SQL guru so I am having trouble trying to figure out how
to format a SQL statement.

I have a table with members named members. Each member has only 1 record.
Then I have a table with member telephone numbers in it name
membertelephones. A member can have more than one telephone number (home,
work, cell, pager, fax, etc.). I want to print out the telephone numbers of
the members. Is it possible to do it in one SQL statement like with a JOIN
or something or do I need to get the members and then loop through the
membertelephones to get the telephone numbers? Is it possible to do a JOIN
with a table with one record with a table with multiple records?

SELECT * FROM member 

SELECT * FROM membertelephone WHERE member_id = the id from the above SELECT

Thanks for the help.

Mike
<>
---(end of broadcast)---
TIP 3: Have you checked our extensive FAQ?

   http://www.postgresql.org/docs/faq


[SQL] Need SQL Help Finding Current Status of members

2005-12-15 Thread Michael Avila
I have a table which keeps track of the status of members. In the table is 


member_id int(8)
status_code char(1)
status_date date 

KEY member_id (member_id,status_code,status_date)


Each member can have multiple records because a record is added each time
the status changes but the old record is kept for history.

What I want to do is find the latest status for each member. Actually I want
to find all those with an status of "A". But it must be the current (latest)
status. How do I find the most current date for each member in a pile of
many records for many members with many status settings with one SQL
statement? This is a bit beyond my capabilities so I am asking for help.

My initial SQL is 

SELECT * FROM memberstatus WHERE status_code = 'a'

but that is my limit. I know an AND comes next but need help after that! I
know that MAX is not for dates so that is out. Is there a LATEST DATE? I did
not see one when I was looking at the date functions.

Appreciate the help.

Mike

<>
---(end of broadcast)---
TIP 2: Don't 'kill -9' the postmaster


Re: [SQL] Need SQL Help Finding Current Status of members

2005-12-16 Thread Michael Avila
Interesting. I think I understand that. I have never worked with a SELECT
within a SELECT (I think that is called a subquery). I am guessing that it
works its way through the member status records until the latest date
"floats" to the top (nothing is > than it).

Will that be a problem performance-wise if there are thousands of records?

Thanks for the help.

Mike


> -Original Message-
> From: [EMAIL PROTECTED]
> [mailto:[EMAIL PROTECTED] Behalf Of Patrick JACQUOT
> Sent: Friday, December 16, 2005 5:12 AM
> Cc: SQL PostgreSQL MailList
> Subject: Re: [SQL] Need SQL Help Finding Current Status of members
>
>
> Richard Huxton wrote:
>
> > Michael Avila wrote:
> >
> >> I have a table which keeps track of the status of members. In the
> >> table is
> >>
> >> member_id int(8)
> >> status_code char(1)
> >> status_date date
> >> KEY member_id (member_id,status_code,status_date)
> >>
> >>
> >> Each member can have multiple records because a record is added each
> >> time
> >> the status changes but the old record is kept for history.
> >>
> >> What I want to do is find the latest status for each member.
> >
> >
> > Michael Fuhr has already described on solution, but if you can alter
> > the table definition then there might be a neater solution.
> >
> > Replace "status_date" with "status_expires" and make it a "timestamp
> > with time zone". Set the expiry to 'infinity' for the current record
> > and  you then have a simple select to find the most recent.
> >
> > If you regularly want to find which record was active on a particular
> > time you'll want two columns: valid_from and valid_to. This makes it
> > much easier to find a row for a specific date.
>
> There is a standard way :
>
> Select * from memberstatus A where not exists
>(select * from emberstatus B where B.member_id=A.member_id and
> B.status_date >A.status_date)
>
> ---(end of broadcast)---
> TIP 5: don't forget to increase your free space map settings


---(end of broadcast)---
TIP 3: Have you checked our extensive FAQ?

   http://www.postgresql.org/docs/faq


Re: [SQL] Need SQL Help Finding Current Status of members

2005-12-16 Thread Michael Avila
Just tried it and it returned nothing.

> > Select * from memberstatus A where not exists
> >(select * from emberstatus B where B.member_id=A.member_id and
> > B.status_date >A.status_date)

Why the WHERE NOT EXISTS?

Here is a copy and paste of my code

$query = "SELECT * FROM memberstatus A WHERE NOT EXISTS (SELECT * from
memberstatus B WHERE B.member_id=A.member_id AND B.status_date >
A.status_date)";

Mike


> -Original Message-
> From: Michael Avila [mailto:[EMAIL PROTECTED]
> Sent: Friday, December 16, 2005 8:46 AM
> To: SQL PostgreSQL MailList
> Subject: RE: [SQL] Need SQL Help Finding Current Status of members
>
>
> Interesting. I think I understand that. I have never worked with
> a SELECT within a SELECT (I think that is called a subquery). I
> am guessing that it works its way through the member status
> records until the latest date "floats" to the top (nothing is > than it).
>
> Will that be a problem performance-wise if there are thousands of records?
>
> Thanks for the help.
>
> Mike
>
>
> > -Original Message-
> > From: [EMAIL PROTECTED]
> > [mailto:[EMAIL PROTECTED] Behalf Of Patrick JACQUOT
> > Sent: Friday, December 16, 2005 5:12 AM
> > Cc: SQL PostgreSQL MailList
> > Subject: Re: [SQL] Need SQL Help Finding Current Status of members
> >
> >
> > Richard Huxton wrote:
> >
> > > Michael Avila wrote:
> > >
> > >> I have a table which keeps track of the status of members. In the
> > >> table is
> > >>
> > >> member_id int(8)
> > >> status_code char(1)
> > >> status_date date
> > >> KEY member_id (member_id,status_code,status_date)
> > >>
> > >>
> > >> Each member can have multiple records because a record is added each
> > >> time
> > >> the status changes but the old record is kept for history.
> > >>
> > >> What I want to do is find the latest status for each member.
> > >
> > >
> > > Michael Fuhr has already described on solution, but if you can alter
> > > the table definition then there might be a neater solution.
> > >
> > > Replace "status_date" with "status_expires" and make it a "timestamp
> > > with time zone". Set the expiry to 'infinity' for the current record
> > > and  you then have a simple select to find the most recent.
> > >
> > > If you regularly want to find which record was active on a particular
> > > time you'll want two columns: valid_from and valid_to. This makes it
> > > much easier to find a row for a specific date.
> >
> > There is a standard way :
> >
> > Select * from memberstatus A where not exists
> >(select * from emberstatus B where B.member_id=A.member_id and
> > B.status_date >A.status_date)
> >
> > ---(end of broadcast)---
> > TIP 5: don't forget to increase your free space map settings


---(end of broadcast)---
TIP 6: explain analyze is your friend


Re: [SQL] Need SQL Help Finding Current Status of members

2005-12-17 Thread Michael Avila
The table is not empty. I did some playing around with the SQL Statement but
got no where. So I added a record status column that will be non-NULL when
the status becomes history because a new status is added. Yeah, I cheated to
make it easy!! LOL But it now works and that is what counts!

Thanks for the help.

Mike


> -Original Message-
> From: Michael Fuhr [mailto:[EMAIL PROTECTED]
> Sent: Saturday, December 17, 2005 7:26 PM
> To: Michael Avila
> Cc: SQL PostgreSQL MailList
> Subject: Re: [SQL] Need SQL Help Finding Current Status of members
>
>
> On Fri, Dec 16, 2005 at 07:44:46PM -0500, Michael Avila wrote:
> > Just tried it and it returned nothing.
> >
> > > > Select * from memberstatus A where not exists
> > > >(select * from emberstatus B where B.member_id=A.member_id and
> > > > B.status_date >A.status_date)
> >
> > Why the WHERE NOT EXISTS?
>
> The query selects each row in memberstatus for which no other rows
> (WHERE NOT EXISTS) with the same member_id have a later status_date;
> in other words, the row(s) with the latest status_date for each
> member_id.  For example, given
>
>  member_id | status_code | status_date
> ---+-+-
>  1 | a   | 2005-12-01
>  1 | b   | 2005-12-02
>  1 | c   | 2005-12-03
>  2 | x   | 2005-12-11
>  2 | y   | 2005-12-12
>  2 | z   | 2005-12-13
>
> the query should return
>
>  member_id | status_code | status_date
> ---+-+-
>  1 | c   | 2005-12-03
>  2 | z   | 2005-12-13
>
> Offhand I can't think of why the query would return nothing unless
> the table is empty, but maybe I'm overlooking something or making
> unwarranted assumptions about the data.  Can you post a sample data
> set for which the query returns no rows?
>
> --
> Michael Fuhr


---(end of broadcast)---
TIP 6: explain analyze is your friend