2016-04-24 4 views
2

Ich habe drei Tabellen: Events, Spots und Buchungen. Events hat viele Spots (Datetime) und Spots hat viele Buchungen.zwei eins zu viele Relationen - jedes Event hat viele Spots und jeder Spot hat viele Buchungen

Ich habe Spalte 'spaces' in Spots Tabelle und 'spot_id' in Buchungen Tabelle. Und in der Tabelle spots muss ich alle Räume addieren GROUP BY event_id und in Buchungen Tabelle muss ich alle Buchungen GROUP BY event_id zählen. Beide Tabellen haben event_id.

Ich brauche die Abfrage so etwas wie:

select S.event_id, sum(S.spaces), count(B.spot_id) 
from spots S, bookings B 
where S.event_id = B.event_id; 

Ich brauche eine Ausgabe wie:

Event_id  sum(Spaces)  count(Bookings) 
    1    300     60 
    2    450    120 

Aber wegen seiner einen zu viele Beziehung, ich Summe von Räumen falsch. wenn ich 60 Buchungen habe = 60 Zeilen, also 60 * actual-sum_of_spaces. Das liegt daran, dass ich mehrere Spots für ein einzelnes Event habe.

Wie bekomme ich die Summe der Leerzeichen von Tabellenspots, wo event_id und sametime Get von allen Buchungen erhalten event_id. Die Anzahl der Zeilen in der Tabelle "Punkte" entspricht nicht der Anzahl der Buchungszeilen.

bookings table

spotstable

Antwort

0

Try this:

$events = DB::table('bookings') 
      ->join(DB::raw('(select S.event_id, sum(S.spaces) as sum_spaces from spots S group by S.event_id) d'), function($join) 
      { 
       $join->on('bookings.event_id', '=', 'd.event_id'); 
      }) 
      ->select('bookings.event_id', 'd.sum_spaces', 
         DB::raw('COUNT(bookings.event_id)')) 
      ->groupBy('bookings.event_id') 
      ->get(); 
+0

Ich habe versucht, die obige Abfrage a Und es wird keine richtige Summe für Leerzeichen erhalten. Ich habe 62 Plätze für Event 1 und 6 Buchungen. Aber ich bekomme 438 Plätze und 24 Buchungen –

+0

Zeigen Sie uns Daten für Ihre Tabellen, damit wir nicht raten müssen. –

+0

Ich habe die Screenshots von beiden Tabellen hinzugefügt. Bitte sehen Sie es sich an. –

0

Sie berechnen können sum(spaces) ersten und verbinden die (abgeleitet) mit bookings führen count(bookings) zu berechnen:

select event_id, sum_spaces, count(b.event_id) count_bookings 
from (
    select S.event_id, sum(S.spaces) as sum_spaces 
    from spots S 
    group by S.event_id 
) d 
join bookings b on b.event_id = d.event_id 
group by b.event_id 
+0

Ich denke, er will eine Laravel PHP-Abfrage. –

+0

@TimBiegeleisen - Wenn ich Beispiele mit 'sum',' count' und abgeleiteten Tabellen betrachte, sehe ich eine Menge 'roher' verwendet. Warum also nicht einfach die komplette Abfrage in einen einzigen DB :: raw? –