Tore,

Thanks very much for this. Question: Is it better to use INNER JOIN than a
WHERE clause (for readability)? They do the same thing, don't they?

I will try this out as soon as a finish another piece of my site. I'm under
a big deadline crunch.

I'll be interested to see if others know of other ways of handling this.

    - Sheryl


----- Original Message -----
From: "Tore Bostrup" <[EMAIL PROTECTED]>
To: "Sheryl Canter" <[EMAIL PROTECTED]>; <[EMAIL PROTECTED]>
Sent: Friday, February 28, 2003 1:41 AM
Subject: Re: SELECT DISTINCT question


DISTINCT works on the result set and across the entire select list.  It will
suppress duplicate result *rows*.

This is an interesting problem when using MySQL due to the lack of support
for nested SELECTs.  In other database systems, I'd use a correlated
subquery in the where clause, but with MySQL a different solution would be
required.

There may be a more direct way, but the following works on both version 4
and 3.23:

DROP TABLE IF EXISTS tmproymax;

CREATE TEMPORARY TABLE tmproymax
    (ProgramID int, Royalty decimal(10,2));

INSERT INTO tmproymax
    SELECT ProgramID,
            Max(Royalty) as MaxRoyalty
    FROM royalties
    GROUP BY ProgramID;

SELECT R.ProgramID,
        R.Royalty,
        A.AuthorID,
        A.FirstName,
        A.LastName
FROM authors as A
    INNER JOIN royalties as R
        ON A.AuthorID = R.AuthorID
    INNER JOIN tmproymax as RM
        ON R.ProgramID = RM.ProgramID
        AND R.Royalty = RM.Royalty;

For using this with PHP, I'm pretty sure you'll have to run each statement
separately, but using the same connection, and you should get the correct
result from the last select.

I'd be interested to hear if there is another trick to working without a
correlated subquery for finding details off of a row identified by Min(),
Max(), etc.

I tried using a CREATE TEMPORARY TABLE tmproymax SELECT ... but couldn't get
the aggergate column named (in version 4), so I could use it in the join in
the last statement.  For version 3.23, that construct would work:

DROP TABLE IF EXISTS tmproymax;

CREATE TEMPORARY TABLE tmproymax
    SELECT ProgramID,
            Max(Royalty) as Royalty
    FROM royalties
    GROUP BY ProgramID;

SELECT R.ProgramID,
        R.Royalty,
        A.AuthorID,
        A.FirstName,
        A.LastName
FROM authors as A
    INNER JOIN royalties as R
        ON A.AuthorID = R.AuthorID
    INNER JOIN tmproymax as RM
        ON R.ProgramID = RM.ProgramID
        AND R.Royalty = RM.Royalty;


HTH,
Tore.



----- Original Message -----
From: "Sheryl Canter" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Wednesday, February 26, 2003 11:49 AM
Subject: SELECT DISTINCT question


> I need help with a query. I have a 'royalties' table that looks like this:
>
> AuthorID    ProgramID    Royalty
> --------------------------------------
> Author1      Program1      0.15
> Author2      Program1      0.10
> Author3      Program2      0.25
> Author4      Program3      0.05
> Author5      Program3      0.20
>
> The primary key of this table is a combination of AuthorID and Program ID.
> Author information is stored in a separate table:
>
> AuthorID    FirstName    LastName
> ----------------------------------------
> Author1      Joe               Smith
> Author2      Brian            Jones
> Author3      Jeff               Tucker
> Author4      Michael        Moore
> Author5      Mark            Mann
>
> The main page of my Web site has a program list that includes the program
> name and author name (and other information). I want it to show the author
> receiving the highest royalty amount. Right now I'm not considering
> the possibility that more than one author can work on a program (since
> currently none is), and my SELECT statement looks similar to this:
>
> SELECT *
> FROM programs p, authors a, royalties r
> WHERE p.ProgramID = r.ProgramID AND a.AuthorID = r.AuthorID
>
> I could change this to SELECT DISTINCT * ..., but then which author would
I
> get? If it's always the first encountered row, then could I avoid checking
> the royalty by always inserting the authors into the table in the correct
> order? (I know this is sloppy.) What is the rule used by SELECT DISTINCT
> to choose which row to return?
>
> If I wanted to do it right and select the author receiving the maximum
> royalty, how would I adjust the SELECT statement?
>
> TIA,
>
>     - Sheryl
>
>
>
>
> ---------------------------------------------------------------------
> Before posting, please check:
>    http://www.mysql.com/manual.php   (the manual)
>    http://lists.mysql.com/           (the list archive)
>
> To request this thread, e-mail <[EMAIL PROTECTED]>
> To unsubscribe, e-mail <[EMAIL PROTECTED]>
> Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php
>


---------------------------------------------------------------------
Before posting, please check:
   http://www.mysql.com/manual.php   (the manual)
   http://lists.mysql.com/           (the list archive)

To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail
<[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php




---------------------------------------------------------------------
Before posting, please check:
   http://www.mysql.com/manual.php   (the manual)
   http://lists.mysql.com/           (the list archive)

To request this thread, e-mail <[EMAIL PROTECTED]>
To unsubscribe, e-mail <[EMAIL PROTECTED]>
Trouble unsubscribing? Try: http://lists.mysql.com/php/unsubscribe.php

Reply via email to