>Hi,
>I've been trying for a while now and I can't figure
>out how to do the following:
>
>In regular English, I wish to show all items for which
>I have allocations greater than one for all days
>encapsulated between the user input range.
>
>User Input:
>-----------
>Date_from      (ie. 2001-02-04)
>Date_to                (ie. 2001-02-06)
>
>My Tables:
>----------
>Table1
>+----+--------+
>| id | name   |
>+----+--------+
>|  1 | Item1  |
>|  2 | Item2 |
>+----+--------+
>
>Table2
>+------------+-------------+-----------+
>| date       | no_of_items | table1_id |
>+------------+-------------+-----------+
>| 2001-02-04 |           3 |         1 |
>| 2001-02-05 |           2 |         1 |
>| 2001-02-06 |           2 |         1 |
>| 2001-02-04 |           2 |         2 |
>| 2001-02-06 |           1 |         2 |
>+------------+-------------+-----------+
>
>Basically my user says he/she needs a list of what
>items are available FROM a certain date TO a certain
>date.  I therefor need to return all items which I
>have at least 1 of for EACH of the dates within my
>users range:
>
>I have tried using BETWEEN but it fails (ie.
>If my user says: from 2001-02-04 to 2001-02-06, using
>BETWEEN MySQL returns Item2 even though I do not have
>Item 2 listed for 2001-02-05.
>
>Here is where I'm at:
>mysql> SELECT t1.*, t2.*
>     ->  FROM Table1 t1, Table2 t2
>     ->  WHERE t2.date BETWEEN "2001-02-04" AND
>"2001-02-06"
>     ->  AND t1.id=t2.table1_id
>     ->  AND t2.no_of_Items >=1;
>
>+----+-------+------------+-------------+-----------+
>| id | Item  | date       | no_of_items | table1_id |
>+----+-------+------------+-------------+-----------+
>|  1 | Item1 | 2001-02-04 |           3 |         1 |
>|  1 | Item1 | 2001-02-05 |           2 |         1 |
>|  1 | Item1 | 2001-02-06 |           2 |         1 |
>|  2 | Item2 | 2001-02-04 |           2 |         2 |
>|  2 | Item2 | 2001-02-06 |           1 |         2 |
>+----+-------+------------+-------------+-----------+
>
>What I need is a query which will generate the
>following result:
>
>+----+-------+------------+-------------+-----------+
>| id | Item  | date       | no_of_items | table1_id |
>+----+-------+------------+-------------+-----------+
>|  1 | Item1 | 2001-02-04 |           3 |         1 |
>|  1 | Item1 | 2001-02-05 |           2 |         1 |
>|  1 | Item1 | 2001-02-06 |           2 |         1 |
>+----+-------+------------+-------------+-----------+
>
>Forgive me if this is actually simple and/or I haven't
>explained clearly.
>
>Many thanks in advance for your help.
>
>-- Frank

Sir, create a variable day_count with the count of days in the 
user-supplied range. Then set up the following temp table.

    CREATE TEMPORARY TABLE counts
    SELECT table1_id, Count(DISTINCT date_field) as cnt
    WHERE data_field BETWEEN min AND max
    GROUP BY id
    HAVING cnt = day_count;

Now you have a table with the IDs of items that occur at least once 
each day in the user-supplied range. You don't need the DISTINCT if 
each item can only have one record per day. Now some inner joins 
should get the results you want.

   SELECT table1.*, table2.*
   FROM table1, table2, counts
   WHERE table1.id = table2.table1_id AND table1.id = counts.table1_id
      AND date_field BETWEEN min AND max;

I haven't actually run this, which means that there's probably a 
mistake or three.

Bob Hall

Know thyself? Absurd direction!
Bubbles bear no introspection.     -Khushhal Khan Khatak

---------------------------------------------------------------------
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