2016-08-18 52 views
0

我有以下表格,并且能够获得在特定日期的特定时间之后开始的类别的结果。 我想要做的是以某种方式只显示少于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

你可以改变表格吗?将一个NUM_BOOKINGS字段添加到您的Class表中,然后仅返回那些预订少于10个的类会不会更容易? –

+0

是的,这是可能的,我想我把表格稍微规格化了一点。这听起来像个好主意。谢谢 – user1907509

+1

很高兴我可以帮到 –

回答

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

该查询使用派生表,我称之为“openClasses”。表格的要点是获得少于10个预订的类的class_ids。这个表然后被内部连接,以限制结果仅限于这一组类。

可能是因为您必须在此派生表中添加where子句才能将其限制为仅限某些状态。

+0

这只需要一点修改就可以使字段名称首字母大写,并且在Group by附近出现错误。除此之外,它效果很好。非常感谢 – user1907509

相关问题