2017-01-05 3 views
1

Ich habe versucht, SUM() zu verwenden, aber es hat nicht funktioniert, vielleicht verwende ich es falsch. DieseSumme mehrerer Werte in verschiedenen Tabellen

ist, wie meine Tabellen fertig sind, ich habe 3: Schicksal, Hotel und Reserve

   Table 1 = destiny 
       des_id | des_name | des_price 
       1  | Brazil  | 800   
       2  | Paris  | 900 

       Table 2 = hotel 
       hot_id | hot_name | hot_price 
       1  | Snowflake | 200 
       2  | Aurora | 300 

       Table 3 = reserve 
       res_id | hotel_id | destiny_id | res_total 
       1 | 1  |  1  | 

Ich möchte, dass die res_total = hot_price + destiny_price der ausgewählten IDs in der Reserve, aber ich bin immer eine abusrd Menge, die

wie das Gesamtbefinden 6000 oder 23000. nicht passieren sollten Dies ist der Code, den ich versucht habe: fehlt

Select res_id, (Sum(hotel_price) + Sum(destiny_price)) as res_total    
from reserve, hotel, destiny    
group by res_id; 
+2

Hinweis: * Niemals * Kommas in der FROM-Klausel verwenden. * Verwenden Sie immer die richtige explizite 'JOIN'-Syntax. –

+0

Wo ist die WHERE-Klausel? – dstudeba

+0

Cross Join führt zu # records in Tabelle 1 * records in Tabelle 2 * records in Tabelle 3 und dann zu Ihrer Summierung. vs INNER JOIN auf geeignete Keys ... Einfach gesagt ... Sie haben keine Definition, wie die Tabellen in Beziehung stehen, so dass alle Datensätze mit allen Datensätzen in jeder Tabelle verbunden werden. Normalerweise eine sehr schlechte Idee. – xQbert

Antwort

0

Ihre Anfrage Joinbedingungen , so dass jedes Tupel mit jedem anderen Tupel verbunden ist (kartesisches Produkt, Cross-Join). Versuchen Sie, die folgende Abfrage:

select r.res_id, ifnull(sum(d.des_price),0) + ifnull(sum(h.hot_price),0) 
from reserve r 
    left join destiny d on r.destiny_id = d.des_id 
    left join hotel h on r.hotel_id = h.hot_id 
group by r.res_id 

Die Abfrage geht davon aus, dass des_id und hot_id sind Schlüssel in destiny und hotel sind. Die Abfrage kann Situationen behandeln, in denen destiny_id und/oder hotel_id in einer Reservierung nicht ausgefüllt sind (daher die left join und die ifnull in der Anweisung).

+0

Was bedeuten das r und das d in "aus reserve r" und "left join de d"? oder was machen sie? – Autoky

+0

sie dienen als Aliase für die jeweilige Tabelle; Wenn Sie zum Beispiel 'from reserve r' definieren, können Sie auf Attribute der Tabelle' reserve' als 'r.destiny_id' statt auf, reserve.destiny_id' verweisen. Manchmal sind Aliase nur Abkürzungen, aber manchmal sind sie wesentlich, z. wenn Sie dieselbe Tabelle mehrmals in derselben Abfrage verwenden. OK? –

+0

Ja, ich verstand Danke, aber es funktioniert immer noch nicht. Es gibt immer noch einen Fehler: "Unbekannte Spalte" obwohl die Spalte korrekt ist. – Autoky

Verwandte Themen