2016-04-29 8 views
1
room  | beds available | ****table room**** 
================================== 
room1  | 4 
room2  | 2 
room3  | 4 

room  | occupant  | ****table occupant**** 
================================== 
room1  | arnold 
room1  | berry 
room2  | charles 
room2  | daisy 
room3  | eric 
room3  | frank 
room3  | greg 

Ich suche die folgende Ausgabe zu erhalten:Zählfeld insgesamt gegen einen anderen Tabellenspalte Wert

Anzahl der Zimmer mit Betten zur Verfügung: 2 || Zimmer mit Betten zur Verfügung: Zimmer 1, Zimmer 3

i rechnen muß ich

  1. Speicher Anzahl * für jeden einzelnen Raum und speichern Sie die Zählung als Array
  2. subtrahieren Betten zur Verfügung für jedes Zimmer gegen diese Array
  3. die Raumnamen angezeigt werden, wenn es ein Ergebnis ist> 0

Wie sollte die pHP-snippet-Code aussehen?

+0

Kurz bevor ich antworten, lassen Sie mich klar nur : Möchten Sie die verfügbaren Betten berechnen, indem Sie die Anzahl der Insassen von der Tabelle "Insassen" von der Nummer in der Tabelle "Zimmer" subtrahieren? – James

+0

Hallo James, ich bin nicht wirklich auf der Suche nach verfügbaren Betten. Dafür habe ich Summe (Betten verfügbar) - Zählung * vom Bewohner verwendet. Ich freue mich auf 1. zählen Sie die Zimmer mit Betten zur Verfügung, und 2. zeigen Sie die Zimmer Name –

+0

Welche DBMS verwenden Sie? –

Antwort

1

Diese SQL-Abfragen werden den Zweck erfüllen.

Erinnern Sie sich, können Sie unerwünschte Spalten entfernen Sie die Datenmenge speichern Sie die Verarbeitung ...

select r.id AS 'room', 
    r.beds as 'total_beds', 
    count(o.occupant) as 'taken_beds', 
    r.beds-count(o.occupant) as 'free_beds' 

FROM room r LEFT JOIN occupant o ON r.id = o.room 
GROUP BY r.id 

HAVING r.beds > count(o.occupant) 

Dies wird nur die Zimmer zurück, die nicht voll sind.

MySQL Result

Wenn an irgendeinem anderen Punkt, Sie möchten zu voll Zimmer zurückzukehren, entfernen Sie einfach die „MIT“ -Klausel

select r.id AS 'room', 
    r.beds as 'total_beds', 
    count(o.occupant) as 'taken_beds', 
    r.beds-count(o.occupant) as 'free_beds' 

FROM room r LEFT JOIN occupant o ON r.id = o.room 
GROUP BY r.id 

MySQL Result without HAVING clause

+0

Hallo James, ist es möglich, die Anzahl der Ergebniszeilen einzeln zu zählen? Zimmer, die nicht voll sind: 2 –

+0

ok, ich habe nur die ganze Abfrage innerhalb einer Anzahl (*) gewickelt und das tut es !!! –

+0

Wenn der Raum überhaupt nicht belegt ist, wird er in dieser Abfrage nicht angezeigt. wenn Zimmer 2 freie Betten = 2 sind, zeigt es nur Zimmer 1 und Zimmer 3. Wie kann ich alle 3 anzeigen? –

0

Ich denke, dies alles mit einer einfachen SQL-Abfrage durchgeführt werden kann, die etwa wie folgt aussehen sollte:

SELECT room.beds AS beds, COUNT(occupant.occupant) AS beds_occupied 
FROM room 
LEFT JOIN occupant ON occupant.room = room.room 
GROUP BY room 
HAVING (beds - beds_occupied) > 0; 

Sie können die ‚MIT‘ Klausel, die zu der WHERE-Klausel ähnelt verwenden, sondern arbeitet mit Aggregaten. Ich habe nicht genau diese Abfrage auf Ihren exakten Tabellen ausgeführt, also könnte es einen Tippfehler geben, jedoch hoffe ich, dass die Idee, was die Abfrage tun soll, klar ist.

0

So etwas, wie, wo, wie viele verfügbaren Betten Sie benötigen ..

SELECT r.*, COUNT(*) AS occupied, r.beds - COUNT(*) AS rest 
FROM room r 
LEFT JOIN occupant o ON r.room = o.room 
GROUP BY r.room 
HAVING r.beds - occupied >= 1 
0

MySQL bietet GROUP_CONCAT zu aggregieren Strings ändern können:

select 
    count(*) as number_of_rooms, 
    group_concat(room) as rooms 
from room r 
where beds_available > 
(
    select count(*) 
    from occupant o 
    where o.room = r.room 
); 

Dies wählt Zimmer mit mehr Betten zur Verfügung als besetzt und aggregiert dann die resultierenden Zeilen zu einer Zeile, die die Anzahl der verfügbaren Räume und eine Zeichenfolge mit den durch Kommas getrennten Raumnamen enthält.

Verwandte Themen