簡體   English   中英

如何計算另一個表中的行以影響另一個表

[英]How to count rows from another table to affect another table

我有下表,並能夠得到在特定日期的特定時間之后開始的類的結果。 我想做的是以某種方式僅顯示預訂少於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)

這是無需更改表即可執行的操作。

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_id。 然后將該表內部聯接以將結果限制為僅此組類。

可能是您必須在此派生表中添加where子句以僅限制為某些狀態。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM