2009-11-23 9 views
1

Je ne peux pas comprendre une requête qui va ajouter et comparer entre les tables. J'ai trois tables:Tri sur une somme de deux tables dans mySQL

maison

id 
----- 
1 
2 

mois

id | house_id | btus 
--------------------- 
3 | 1  | 100 
4 | 2  | 200 

voiture

id | month_id | btu 
-------------------------- 
5 | 3  | 10 
6 | 4  | 20 
7 | 3  | 15 

je besoin d'une requête qui renverra la maison ids triées par btus au total pour le mois et voiture.

Donc, pour l'exemple ci-dessus reviendrait 2,1 en (200 + 20)> (100 + 10 + 15)

+0

Devrait-il plutôt être '(100 + 10 + 15)'? – Quassnoi

+0

Oui ... il le devrait. Merci. – Emily

Répondre

3
SELECT h.* 
FROM house 
ORDER BY 
     (
     SELECT SUM(c.btu) 
     FROM month m 
     JOIN cars c 
     ON  c.month_id = m.id 
     WHERE m.house_id = h.id 
     ) + 
     (
     SELECT SUM(m.btus) 
     FROM month m 
     WHERE m.house_id = h.id 
     ) 
     DESC 

, ou celui-ci (probablement un peu plus efficace):

SELECT h.* 
FROM house 
ORDER BY 
     (
     SELECT SUM 
       (
       btus + 
       (
       SELECT SUM(btu) 
       FROM cars c 
       WHERE c.month_id = m.id 
       ) 
       ) 
     FROM month m 
     WHERE m.house_id = h.id 
     ) 
     DESC 
0

Probablement pas l'utilisation la plus performante de jointures, mais:

SELECT house.id 
    FROM house JOIN month JOIN car 
    WHERE house.id = month.house_id AND month.id = car.month_id 
GROUP BY house.id 
ORDER BY sum(car.btu) + sum(month.btus); 

les jointures et où la clause va exploser les tables (essayez i t avec SELECT * et en ignorant les clauses group/order), group by va les aplatir d'une ligne chacun, et sum() fera le calcul correspondant.