如何计算另一个表中的行以影响另一个表

时间:2016-08-18 13:37:23

标签: mysql sql

我有以下表格,并且能够获得在特定日期的特定时间之后开始的类的结果。 我想要做的只是显示少于10个预订相关的课程。

我已创建此sql查询以获取特定用户可以预订的类,但我想隐藏已经在相关课程中已经预订了10个人的类。即如果有10个或更多相关预订,则该课程已满,所以我不想展示这些课程。

非常感谢任何帮助。

SELECT DISTINCT b.name
              , a.time 
           FROM class a   
           JOIN class_detail b 
             ON a.class_id = b.id   
           JOIN branch c 
             ON a.branch_id = c.id 
          WHERE c.level <= ( SELECT d.level 
                               FROM client d 
                              WHERE d.facebook_id = 'xxxxxx'
                           )
            AND a.date = '2016-08-17' 
            AND a.time >= '13.00.00';

BOOKINGS
+-----------+-------------+------+-----+---------+-------+
| Field     | Type        | Null | Key | Default | Extra |
+-----------+-------------+------+-----+---------+-------+
| id        | bigint(20)  | NO   | PRI | NULL    |       |
| CLIENT_ID | int(11)     | NO   |     | NULL    |       |
| CLASS_ID  | int(11)     | NO   |     | NULL    |       |
| STATUS    | varchar(10) | NO   |     | NULL    |       |
+-----------+-------------+------+-----+---------+-------+

mysql> show fields from BRANCH;
+---------------------+-------------+------+-----+---------+----------------+
| Field               | Type        | Null | Key | Default | Extra          |
+---------------------+-------------+------+-----+---------+----------------+
| id                  | int(10)     | NO   | PRI | NULL    | auto_increment |
| NAME                | char(50)    | NO   |     | NULL    |                |
| CONTACT_NO          | char(50)    | YES  |     | NULL    |                |
| MAP_IMG_PATH        | char(200)   | YES  |     | NULL    |                |
| ADDRESS             | char(200)   | YES  |     | NULL    |                |
| LEVEL               | int(2)      | NO   |     | NULL    |                |
| LOCATION            | int(10)     | YES  |     | NULL    |                |
| SECTOR_NAME         | varchar(45) | YES  |     | NULL    |                |
| SECTOR_MAP_IMG_PATH | char(200)   | YES  |     | NULL    |                |
+---------------------+-------------+------+-----+---------+----------------+



mysql> show fields from CLIENT;
+--------------+-------------+------+-----+---------+-------+
| Field        | Type        | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| id           | int(10)     | NO   | PRI | NULL    |       |
| NAME         | char(50)    | NO   |     | NULL    |       |
| DOB          | int(8)      | NO   |     | NULL    |       |
| LOCAL_BRANCH | int(10)     | YES  |     | NULL    |       |
| FACEBOOK_ID  | char(50)    | NO   |     | NULL    |       |
| START_DATE   | int(8)      | NO   |     | NULL    |       |
| EMAIL        | char(50)    | YES  |     | NULL    |       |
| PIN          | int(4)      | YES  |     | NULL    |       |
| END_DATE     | int(8)      | NO   |     | NULL    |       |
| LEVEL        | int(2)      | YES  |     | NULL    |       |
| TEL          | varchar(20) | YES  |     | NULL    |       |
+--------------+-------------+------+-----+---------+-------+



mysql> show fields from CLASS_DETAIL;
+--------------+--------------+------+-----+---------+-------+
| Field        | Type         | Null | Key | Default | Extra |
+--------------+--------------+------+-----+---------+-------+
| id           | int(10)      | NO   | PRI | NULL    |       |
| NAME         | char(50)     | NO   |     | NULL    |       |
| DESCRIPTION  | char(200)    | NO   |     | NULL    |       |
| CATEGORY     | varchar(4)   | YES  |     | NULL    |       |
| ACHIEVE_TYPE | char(200)    | YES  |     | NULL    |       |
| IMG_M        | varchar(200) | YES  |     | NULL    |       |
| IMG_F        | varchar(200) | YES  |     | NULL    |       |
+--------------+--------------+------+-----+---------+-------+



mysql> show fields from CLASS;
+-----------+---------+------+-----+---------+----------------+
| Field     | Type    | Null | Key | Default | Extra          |
+-----------+---------+------+-----+---------+----------------+
| id        | int(11) | NO   | PRI | NULL    | auto_increment |
| CLASS_ID  | int(10) | YES  |     | NULL    |                |
| BRANCH_ID | int(10) | NO   |     | NULL    |                |
| DURATION  | int(3)  | YES  |     | NULL    |                |
| DATE      | date    | NO   |     | NULL    |                |
| TIME      | time    | NO   |     | NULL    |                |
| STATUS    | char(1) | NO   |     | NULL    |                |
+-----------+---------+------+-----+---------+----------------+
7 rows in set (0.11 sec)

1 个答案:

答案 0 :(得分:1)

以下是如何在不更改表格的情况下执行此操作的方法。

SELECT DISTINCT b.name
              , a.time 
           FROM class a 
           Inner join (SELECT class_id, count(clientid) 
                       FROM bookings 
                       GROUP BY class_id
                       HAVING count(clientid) < 10) as openClasses on        
                a.class_id = openClasses.class_id
           JOIN class_detail b 
             ON a.class_id = b.id   
           JOIN branch c 
             ON a.branch_id = c.id 
          WHERE c.level <= ( SELECT d.level 
                               FROM client d 
                              WHERE d.facebook_id = 'xxxxxx'
                           )
            AND a.date = '2016-08-17' 
            AND a.time >= '13.00.00';

此查询使用派生表,我称之为&#34; openClasses&#34;。该表的要点是获取少于10个预订的类的class_ids。然后将此表连接到内部以将结果限制为仅这组类。

您可能需要在此派生表中添加where子句,以仅限制某些状态。