2017-04-10 5 views
0

Ich habe drei Tabellen: - Zimmer: Informationen über Zimmer - Betten: Informationen über jedes Bett im Zimmer (Typ, ...) mit roomId auf Raum verknüpft - Zuteilungen: info über die Anzahl der Betten in einem zugewiesenen Zimmer eine Liste mit der Anzahl der Betten und Anzahl der zugeordneten Betten in einem RaumMehrere Abfragen benötigt?

Proben zu einer Gruppe (2 Gruppen in einem Raum möglich)

ich mag:

SELECT 
COUNT(beds.id) AS beds 
FROM rooms 
JOIN beds ON rooms.id=beds.roomID 
WHERE rooms.id='124' 

die Anzahl der Betten gibt im Zimmer (8).

SELECT 
SUM(requestsAllocations.bedsAllocated) AS allocated, 
from rooms 
join requestsAllocations on requestsAllocations.roomID=rooms.id 
where rooms.id='124' 

gibt mir die Anzahl der zugeordneten Betten im Zimmer: 7 (1 + 6)

SELECT 
COUNT(beds.id) AS beds, 
SUM(requestsAllocations.bedsAllocated) AS allocated 
FROM rooms 
JOIN requestsAllocations ON requestsAllocations.roomID=rooms.id 
JOIN beds ON rooms.id=beds.roomID 
WHERE rooms.id='124' 

gibt mir:

beds | allocated 
---------------- 
16 | 56 
  • 16 Betten (Anzahl zweimal wegen 2 Datensätze in Zuordnungstabelle)
  • 56 zugewiesene Betten (7 * 8 = 56)

Wie kann ich eine Abfrage erstellen, um korrekte Ergebnisse zu erhalten?

beds | allocated 
---------------- 
8 | 7 

Vielen Dank!

Antwort

0

Um die richtige Anzahl der Betten zu bekommen, können Sie einfach einen deutlichen

COUNT(distinct beds.id) AS beds 
zu Ihrem count

hinzufügen

Um diese Multiplikation der zugeordneten Betten zu vermeiden, können Sie eine Abhilfe wie

SUM(requestsAllocations.bedsAllocated)/COUNT(distinct beds.id) as allocated 

verwenden können Die letzte Abfrage wäre

SELECT COUNT(distinct t3.id) AS beds, 
     SUM(t2.bedsAllocated)/COUNT(distinct t3.id) AS allocated 
FROM rooms t1 
JOIN requestsAllocations t2 
ON  t2.roomID = t1.id 
JOIN beds t3 
ON  t1.id = t3.roomID 
WHERE t1.id='124' 

Ich gab auch Aliase zu Ihrem Tabellen zur besseren Lesbarkeit

0

Sie müssen mindestens eine der Aggregationen (count oder sum) in einer Unterabfrage ausführen, damit die doppelten Datensätze die aggregierten Ergebnisse nicht beeinflussen. Oder Sie können einfach in zwei korrelierten Unterabfragen in der Auswahlliste aggregieren:

select rooms.id, 
     (select count(*) from beds where beds.roomID=rooms.id) as bed_count, 
     (select sum(bedsAllocated) from requestsAllocations where requestsAllocations.roomID=rooms.id) as allocated_count 
from rooms