2016-08-18 6 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_idを取得することです。次に、このテーブルを内部結合して結果をこのクラスのセットのみに制限します。

特定のステータスのみに制限するために、この派生テーブルにwhere句を追加する必要がある場合があります。

+0

これはちょうどフィールド名首都を作るためにちょっとした改造が必要で、グループの近くにエラーがありました。それ以外は素晴らしい作品です。どうもありがとう – user1907509

関連する問題