2010-11-11 9 views
0

J'ai 2 tables fun (maître) et blk (esclave).groupe sqlite3 par

sqlite> select * from fun; 
id   mod_id  name   freq  
---------- ---------- ----------- ---------- 
1   1   adpcm_coder 99108  
2   1   adpcm_decod 0   

Je veux compter combien de blk il y a pour le plaisir, donc j'utiliser « groupe par »:

sqlite> SELECT fun.*, count(blk.id) as no_blk FROM fun, blk WHERE fun.id=blk.fun_id GROUP BY (blk.fun_id); 
id   mod_id  name   freq  no_blk  
---------- ---------- ----------- ---------- ---------- 
1   1   adpcm_coder 99108  12   

La 2ème ligne est rejetée depuis blks car il n'existe pas. Comment obtenir un résultat comme celui-ci?

id   mod_id  name   freq  no_blk  
---------- ---------- ----------- ---------- ---------- 
1   1   adpcm_coder 99108  12   
2   1   adpcm_decod 0   0 

Répondre

3

Vous voulez un OUTER JOIN.
Vous devez également GROUP BY toutes les colonnes non agrégées dans votre clause SELECT.

Essayez quelque chose comme ceci:

SELECT fun.id, fun.mod_id, fun.name, fun.freq, count(blk.id) as no_blk 
    FROM fun 
     LEFT OUTER JOIN blk 
     ON blk.fun_id = fun.id 
GROUP BY fun.id, fun.mod_id, fun.name, fun.freq; 
+0

thx adam. Cela fonctionne très bien. Pourrait expliquer pourquoi je dois utiliser dans un groupe - par toutes les colonnes non agrégées? Est-ce parce que certains d'entre eux peuvent avoir des valeurs nulles? THX. – name

+0

Cheers, mate. En jetant un autre coup d'oeil à votre requête, il apparaît que, avec 'fun. *', Vous étiez en fait en train de regrouper toutes les colonnes non agrégées. Si vous ne l'aviez pas fait, vous remarqueriez probablement que votre résultat serait plus petit que prévu. – bernie

1

Adam est correct; une autre approche:

SELECT fun.*, count(blk.id) as no_blk FROM fun, blk 
WHERE fun.id=blk.fun_id GROUP BY (blk.fun_id) 
UNION 
SELECT fun.*, 0 as no_blk FROM fun, blk 
WHERE fun.id not in (SELECT fun.id from fun, blk WHERE fun.id=blk.fun_id);