2016-08-18 2 views
0

Ich habe die folgenden Tabellen und war in der Lage, ein Ergebnis von Klassen zu erhalten, die nach einer bestimmten Zeit an einem bestimmten Datum beginnen. Was ich machen möchte ist, dass ich nur Klassen zeige, die weniger als 10 Buchungen haben.Wie man Zeilen von einer anderen Tabelle zählt, um eine andere Tabelle zu beeinflussen

Ich habe diese SQL-Abfrage erstellt, um die Klassen zu erhalten, die ein bestimmter Benutzer buchen kann, aber ich möchte die Klassen ausblenden, wo bereits 10 Personen in der fraglichen Klasse bereits gebucht sind. I.e. Die Klasse ist voll, wenn es 10 oder mehr verbundene Buchungen gibt, also möchte ich diese Klassen nicht zeigen.

Jede Hilfe würde sehr geschätzt werden.

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

Können Sie die Tabellen ändern? Wäre es nicht einfacher, ein NUM_BOOKINGS-Feld zu Ihrer Class-Tabelle hinzuzufügen und dann nur die Klassen mit weniger als 10 Buchungen zurückzugeben? –

+0

Ja, das ist möglich, ich denke, ich habe die Tabellen ein wenig zu weit normalisiert. Das klingt nach einer guten Idee. Danke – user1907509

+1

Ich bin froh, dass ich helfen konnte –

Antwort

1

So können Sie dies tun, ohne Änderungen an Ihren Tabellen vorzunehmen.

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

Diese Abfrage verwendet eine abgeleitete Tabelle, die ich "openClasses" genannt. Der Punkt der Tabelle ist, die class_ids der Klassen zu erhalten, die weniger als 10 Buchungen haben. Diese Tabelle wird dann intern verknüpft, um Ergebnisse auf diese Gruppe von Klassen zu beschränken.

Möglicherweise müssen Sie dieser abgeleiteten Tabelle eine where-Klausel hinzufügen, um sie auf bestimmte Status zu beschränken.

+0

Dies erfordert nur ein wenig Nacharbeit, um die Feldnamen Großbuchstaben zu machen und es gab einen Fehler in der Nähe von Group by. Ansonsten funktioniert es super. Danke vielmals – user1907509

Verwandte Themen