Assuming that you *don't* want ALL purchases made prior to the range, but
only those of subjects not purchased recently, the following query appears
to work:

-- First gather info about recent purchases
Create TEMPORARY Table recent
SELECT B.id, B.date_purch, S.subj
FROM subj as S
  INNER JOIN book as B
    ON S.book_id = B.id
-- Last 6 months:
WHERE B.date_purch >= DATE_ADD(CURRENT_DATE(), INTERVAL -6 MONTH);

-- Then do an outer join with ALL purchases
SELECT B.id, B.date_purch, S.subj
FROM subj as S
  INNER JOIN book as B
    ON S.book_id = B.id
  LEFT OUTER JOIN recent as R
    ON R.subj = S.subj
-- but list only those with no recent purchases:
WHERE R.id IS NULL;

If you only want the subjects returned (and once each), remove B.id and
B.date_purch from the (2nd) SELECT list, and include a DISTINCT.

As a MySQL newbie, I couldn't get it to work as a single statement which
"logically" (AFAIK) should have returned the same data on 4.0 (returned no
result on 4.0, gave error on 3.23):

SELECT B.id, B.date_purch, S.subj
FROM subj as S
  INNER JOIN book as B
    ON S.book_id = B.id
  LEFT OUTER JOIN
    (book as B2
      INNER JOIN subj as S2
        ON S2.book_id = B2.id
        AND B2.date_purch >= DATE_ADD(CURRENT_DATE(), INTERVAL -6 MONTH)
        )
    ON S2.subj = S.subj
WHERE B2.id IS NULL

Is there a restriction, quirk, or bug in MySQL that prevents parenthesised
joins from working properly?

HTH,
Tore.

----- Original Message -----
From: "Jesse Sheidlower" <[EMAIL PROTECTED]>
To: <[EMAIL PROTECTED]>
Sent: Monday, February 24, 2003 8:09 PM
Subject: Select based on related date


>
> I'm having trouble with a query that I thought would be pretty
> straightforward. To simplify, I have a database of books that
> has, say, two tables:
>
> CREATE TABLE book (
>     id           INT,
>     date_purch   DATE
> )
>
> CREATE TABLE subj (
>     book_id      INT,
>     subj         TEXT
> )
>
> Each book can have any number of subjects, and each book has
> at least one subject.
>
> I'd like to get all subjects that are in the subject table
> that are _not_ represented in a particular date range. For
> example, if I have bought books with subjects 'Computing',
> 'Cooking', 'Baseball', and 'Fiction', but in the last six
> months I have only bought Fiction and Baseball, I'd like a
> query that will give me Computing and Cooking.
>
> I played around with a few LEFT JOINS but I still seem to be
> missing something.
>
> Thanks.
>
> Jesse Sheidlower
>
>
> ---------------------------------------------------------------------
> 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