2016-08-18 103 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