Hi Shawn,

Thanks for your reply. The query you suggested seems to return all practices that have bookings where the day type does not equal '1' - I changed your query so it searches on the day_type rather than work_type as this is what is required:

SELECT p.Practice_ID
       ,p.Practice_Name
       ,b.Booking_ID
       ,wt.Project_ID
       ,SUM(If(wt.Day_Type=1,1,0)) as WorkType_1
       ,count(1) as TotalWorkType
FROM Practices p
INNER JOIN Bookings b
       ON b.Practice_ID = p.Practice_ID
INNER JOIN Work_Types wt
       ON wt.Work_Type_ID = b.Work_Type_ID
GROUP BY 1,2,3,4
HAVING WorkType_1=0;

Let me give you an example. Your query returns this in the last row:

+-------------+------------------------------------------+------------+------------+------------+---------------+
| Practice_ID | Practice_Name | Booking_ID | Project_ID | WorkType_1 | TotalWorkType |
+-------------+------------------------------------------+------------+------------+------------+---------------+
| 11094 | Bugbrooke Surgery | 7114 | 12 | 0 | 1 |
+-------------+------------------------------------------+------------+------------+------------+---------------+


But if i select all bookings where the practice_id = 11094 i get another booking where the day_type = 1:

mysql> SELECT * FROM Bookings WHERE Practice_ID = 11094;
+------------+--------------+---------+------------+--------+-------------+--------------------+-----------------------+---------------------+---------------------+-------------------------+-----------------+----------------+-------------------+---------+--------------+--------------------+---------------------------------------+---------------------------------------------+-----------+-----------------+---------------+
| Booking_ID | Booking_Type | User_ID | Project_ID | Rep_ID | Practice_ID | Booking_Creator_ID | Booking_Creation_Date | Booking_Start_Date | Booking_End_Date | Booking_Completion_Date | Booking_Mileage | Booking_Status | Unavailability_ID | Task_ID | Work_Type_ID | Additional_Notes | Pre_Event_Copy_Received_By_Scheduling | Post_Event_Original_Completed_Form_Received | Section_C | Date_Difference | AU_Booking_ID |
+------------+--------------+---------+------------+--------+-------------+--------------------+-----------------------+---------------------+---------------------+-------------------------+-----------------+----------------+-------------------+---------+--------------+--------------------+---------------------------------------+---------------------------------------------+-----------+-----------------+---------------+
| 7112 | Booking | 52 | 12 | 638 | 11094 | 1174 | 2005-04-19 12:31:51 | 2005-05-04 09:30:00 | 2005-05-04 18:00:00 | NULL | 0 | Incomplete | NULL | 7 | 22 | x | No | No | No | n/a | NULL |
| 7114 | Booking | 1601 | 12 | 638 | 11094 | 1174 | 2005-04-19 12:57:53 | 2005-05-25 09:30:00 | 2005-05-25 18:00:00 | NULL | 0 | Incomplete | NULL | 7 | 24 | x | No | No | No | n/a | NULL |
+------------+--------------+---------+------------+--------+-------------+--------------------+-----------------------+---------------------+---------------------+-------------------------+-----------------+----------------+-------------------+---------+--------------+--------------------+---------------------------------------+---------------------------------------------+-----------+-----------------+---------------+
2 rows in set (0.02 sec)


mysql> SELECT * FROM Work_Types WHERE Project_ID = 12;
+--------------+------------+----------+-----------+
| Work_Type_ID | Project_ID | Day_Type | Work_Type |
+--------------+------------+----------+-----------+
|           22 |         12 |        1 | Day 1     |
|           24 |         12 |        2 | Day 2     |
+--------------+------------+----------+-----------+
2 rows in set (0.00 sec)

mysql>

Do you see my problem here?! Any advice would be greatly appreciated...


Shaun


From: [EMAIL PROTECTED]
To: "shaun thornburgh" <[EMAIL PROTECTED]>
CC: mysql@lists.mysql.com
Subject: Re: How can I find this data?
Date: Wed, 4 May 2005 09:42:47 -0400

"shaun thornburgh" <[EMAIL PROTECTED]> wrote on 05/04/2005
06:54:23 AM:

> Hi,
>
> I have four tables among others in my database: Bookings, Work_Types,
> Practices & Projects. Bookings occur in a Practice for a Project and
have a
> Work_Type. A Practice can have many Bookings but must have one and only
one
> Booking where the Work_Type.Day_Type = 1. This rule was introduced after
the
> system was initially set up and I have a feeling there may be Practices
that
> have no Day 1's. So how can I perform a query that returns all practices

> that have had bookings but no Day 1's for a particualar project? Please
see
> table definitions below.
>
> Thanks very much for your help.
>
> mysql> desc Bookings;
> +---------------------------------------------+-------------+------
> +-----+---------------------+----------------+
> | Field                                       | Type        | Null | Key
|
> Default             | Extra          |
> +---------------------------------------------+-------------+------
> +-----+---------------------+----------------+
> | Booking_ID                                  | int(11)     |      | PRI
|
> NULL                | auto_increment |
> | Booking_Type                                | varchar(15) |      | |
> Unavailability      |                |
> | User_ID                                     | int(11)     |      | | 0

>                    |                |
> | Project_ID                                  | int(11)     | YES  | |
> NULL                |                |
> | Rep_ID                                      | int(11)     | YES  | |
> NULL                |                |
> | Practice_ID                                 | int(11)     | YES  | |
> NULL                |                |
> | Booking_Creator_ID                          | int(11)     | YES  | |
> NULL                |                |
> | Booking_Creation_Date                       | datetime    | YES  | |
> NULL                |                |
> | Booking_Start_Date                          | datetime    |      | |
> 0000-00-00 00:00:00 |                |
> | Booking_End_Date                            | datetime    |      | |
> 0000-00-00 00:00:00 |                |
> | Booking_Completion_Date                     | date        | YES  | |
> NULL                |                |
> | Booking_Mileage                             | int(5)      | YES  | |
> NULL                |                |
> | Booking_Status                              | varchar(15) |      | |
> Other               |                |
> | Unavailability_ID                           | int(2)      | YES  | |
> NULL                |                |
> | Task_ID                                     | int(11)     | YES  | |
> NULL                |                |
> | Work_Type_ID                                | int(2)      | YES  | |
> NULL                |                |
> | Additional_Notes                            | text        | YES  | |
> NULL                |                |
> | Pre_Event_Copy_Received_By_Scheduling       | char(3)     | YES  | |
> NULL                |                |
> | Post_Event_Original_Completed_Form_Received | char(3)     | YES  | |
> NULL                |                |
> | Section_C                                   | char(3)     | YES  | |
> NULL                |                |
> | Date_Difference                             | varchar(20) |      | |
> n/a                 |                |
> | AU_Booking_ID                               | int(11)     | YES  | |
> NULL                |                |
> +---------------------------------------------+-------------+------
> +-----+---------------------+----------------+
> 22 rows in set (0.00 sec)
>
> mysql> desc Projects;
> +----------------------------+--------------+------+-----+---------
> +----------------+
> | Field                      | Type         | Null | Key | Default |
Extra
>         |
> +----------------------------+--------------+------+-----+---------
> +----------------+
> | Project_ID                 | int(11)      |      | PRI | NULL    |
> auto_increment |
> | Project_Name               | varchar(100) |      |     |         |
>         |
> | Client_ID                  | int(11)      |      |     | 0       |
>         |
> | Rep_Viewable               | char(3)      |      |     | Yes     |
>         |
> | Administrator_ID           | int(11)      | YES  |     | NULL    |
>         |
> | Administrator_Phone_Number | varchar(20)  |      |     |         |
>         |
> | Project_Manager_ID_1       | int(11)      | YES  |     | NULL    |
>         |
> | Project_Manager_ID_2       | int(11)      | YES  |     | NULL    |
>         |
> +----------------------------+--------------+------+-----+---------
> +----------------+
> 8 rows in set (0.00 sec)
>
> mysql> desc Practices;
>
+--------------------+--------------+------+-----+---------+----------------+
> | Field              | Type         | Null | Key | Default | Extra
> |
>
+--------------------+--------------+------+-----+---------+----------------+
> | Practice_ID        | int(11)      |      | PRI | NULL    |
auto_increment
> |
> | PCT_ID             | int(11)      |      |     | 0       |
> |
> | Practice_Name      | varchar(40)  |      |     |         |
> |
> | Practice_Address   | varchar(255) |      |     |         |
> |
> | Practice_Postcode  | varchar(10)  |      |     |         |
> |
> | Practice_Telephone | varchar(15)  |      |     |         |
> |
> | Practice_Manager   | varchar(40)  |      |     |         |
> |
> | Practice_Lead_GP   | varchar(40)  |      |     |         |
> |
> | Practice_List_Size | int(11)      | YES  |     | NULL    |
> |
> | Practice_System    | varchar(100) |      |     |         |
> |
> | NHS_ID             | varchar(20)  | YES  |     | NULL    |
> |
> | MiQuest            | char(3)      | YES  |     | NULL    |
> |
>
+--------------------+--------------+------+-----+---------+----------------+
> 12 rows in set (0.01 sec)
>
> mysql> desc Work_Types;
> +--------------+-------------+------+-----+---------+----------------+
> | Field        | Type        | Null | Key | Default | Extra          |
> +--------------+-------------+------+-----+---------+----------------+
> | Work_Type_ID | int(3)      |      | PRI | NULL    | auto_increment |
> | Project_ID   | int(11)     | YES  |     | NULL    |                |
> | Day_Type     | int(2)      | YES  |     | NULL    |                |
> | Work_Type    | varchar(40) |      |     |         |                |
> +--------------+-------------+------+-----+---------+----------------+
> 4 rows in set (0.01 sec)
>
> mysql>
>
>

Thank you for posting your table structures. It makes your questions MUCH
easier to answer. However, as you can see in my response, the DESC command
usually creates output that is wrapped by many email clients. I recommend,
for next time, trying the \G option of SHOW CREATE TABLE. It lines up
everything vertically and it provides not just the field definitions but
your index and foreign key definitions as well (those can be VERY helpful
in certain cases). Its output is also ready-to-use if anyone wants to
recreate your table structure while helping you.  Here is a sample of what
one of those commands would look like (notice I replaced the semicolon
with \G):

SHOW CREATE TABLE Work_Types\G

To answer your question: I think this will help you to identify which
Practices have Projects where none of the Project's work_types =1:

SELECT p.Practice_ID
        ,p.Practice_Name
        ,b.Booking_ID
        ,wt.Project_ID
        ,SUM(If(wt.Work_Type=1,1,0)) as WorkType_1
        ,count(1) as TotalWorkType
FROM Practice p
INNER JOIN Booking b
        ON b.Practice_ID = p.Practice_ID
INNER JOIN Work_Types wt
        ON wt.Work_Type_ID = b.Work_Type_ID
GROUP BY 1,2,3,4
HAVING WorkType_1=0;

This same query will also help you to identify Projects where there are
more than one Work_Type=1's. All you need to do is change the HAVING
clause like this

SELECT p.Practice_ID
        ,p.Practice_Name
        ,b.Booking_ID
        ,wt.Project_ID
        ,SUM(If(wt.Work_Type=1,1,0)) as WorkType_1
        ,count(1) as TotalWorkType
FROM Practice p
INNER JOIN Booking b
        ON b.Practice_ID = p.Practice_ID
INNER JOIN Work_Types wt
        ON wt.Work_Type_ID = b.Work_Type_ID
GROUP BY 1,2,3,4
HAVING WorkType_1>1;

If you are wondering about the clause "GROUP BY 1,2,3,4", that is a MySQL
shortcut to say that I want to GROUP on those columns. In other RDBMS
systems I would have needed to type

GROUP BY p.Practice_ID,p.Practice_Name,b.Booking_ID,wt.Project_ID

I like the shortcut; I think it's just easier to read.

Shawn Green
Database Administrator
Unimin Corporation - Spruce Pine



-- MySQL General Mailing List For list archives: http://lists.mysql.com/mysql To unsubscribe: http://lists.mysql.com/[EMAIL PROTECTED]



Reply via email to