Re: Re: Fwd: Silly question about numbering of rows? - Mailing list pgsql-novice

From Anthony E . Greene
Subject Re: Re: Fwd: Silly question about numbering of rows?
Date
Msg-id 20010314020524.I21527@cp5340
Whole thread Raw
In response to Re: Fwd: Silly question about numbering of rows?  (Ken Corey <ken.corey@atomic-interactive.com>)
List pgsql-novice
On Tue, 13 Mar 2001 09:55:54 Ken Corey wrote:
>> >         id |      make | model | year  | value
>> > ---------+-----------+--------+-------+-------
>> >        57 |            2 |        0 |       4 |  4750
>> >        57 |            2 |        3 |       4 |  4750
>> >        57 |            2 |        0 |       0 |  4750
>> >        57 |            2 |        0 |       3 |  4750
>> >        57 |            2 |        3 |       0 |  4750
>> >        57 |            2 |        3 |       3 |  4750
>> >          2 |            2 |        0 |       3 |  4750
>> >          2 |            2 |        3 |       3 |  4750
>> >          2 |            2 |        0 |       4 |  4350
>> >          2 |            2 |        3 |       4 |  4350
>> >          2 |            2 |        0 |       0 |  4750
>> >          2 |            2 |        0 |       5 |  4750
>> >          2 |            2 |        3 |       0 |  4750
>> >          2 |            2 |        3 |       5 |  4750
>>
>> The potential for duplicate records is rampant here.  What is the primary
>> key?  Do these values use foreign keys?
>
>The primary key is id/make/model/year, sorted by sum(value).
>
>Doh! I think I forgot to mention a critical part: selects on the table vary
>
>model and year to be either '0' (which represents 'all') or the specific
>number concerned.
>
>So, there are 4 ways to slice this data:
>    a particular make, all models, all years
>    a particular make, particular model, all years
>    a particular make, all model, particular years
>    a particular make, particular model, particular years

It seems to me that you are misusing the WHERE clause in your queries. Why
not just select like this:

SELECT *
  FROM tblname
  WHERE make='$make';

SELECT *
  FROM tblname
  WHERE make='$make' AND model='$model';

SELECT *
  FROM tblname
  WHERE make='$make'
    AND YEAR >= '$lowyear' AND YEAR <= '$highyear';

SELECT *
  FROM tblname
  WHERE make='$make'
    AND model='$model'
    AND YEAR >= '$lowyear' AND YEAR <= '$highyear';

That way you don't need a zero in your column values to simulate 'all'. This
will ensure each row actually represents an automobile and not some
artificial entry created for use in queries.

Your application logic will only be a little more complicated, and your
queries will be a lot faster, especially as your table size grows. In Perl,
I'd do something like this:

$sql = 'SELECT * FROM tblname ';
if ($make > 0 && $model == 0 && $year == 0) {
  $sql .= "WHERE make='$make'";
} elsif ($make > 0 && $model > 0 && $year == 0) {
  $sql .= "WHERE make='$make' AND model='$model'";
} elsif ($make > 0 && $model == 0 && $year > 0) {
  $sql .= "WHERE make='$make' AND year='$year'";
} elsif ($make > 0 && $model > 0 && $year > 0) {
  $sql .= "WHERE make='$make' AND model='$model' AND year='$year'";
} else {
  # Some error-handling code here
}



Tony
--
Anthony E. Greene <agreene@pobox.com> <http://www.pobox.com/~agreene/>
PGP Key: 0x6C94239D/7B3D BD7D 7D91 1B44 BA26  C484 A42A 60DD 6C94 239D
Chat:  AOL/Yahoo: TonyG05    ICQ: 91183266
Linux. The choice of a GNU Generation. <http://www.linux.org/>

pgsql-novice by date:

Previous
From: Andrew McMillan
Date:
Subject: Re: Fwd: Silly question about numbering of rows?
Next
From: Thomas Heinis
Date:
Subject: Memory exhausted in AllocSetAlloc()