2010-05-31 6 views
2

J'ai deux tables: une table de fichiers, qui inclut le type de fichier, et une table de propriétés de fichier, qui fait référence à la table de fichiers via une clé étrangère. Tableau des fichiers d'exemple:Sql: agrégation simultanée à partir de deux tables

| id | name | type | 
--------------------- 
| 1 | file1 | zip | 
| 2 | file2 | zip | 
| 3 | file3 | zip | 
| 4 | file4 | jpg | 

Et la table Propriétés:

| file_id | property | 
----------------------- 
| 1  |  x | 
| 2  |  x | 

Je veux faire une requête, qui indique le nombre de chaque type de fichier, et combien de fichiers de ce type ont une propriété.

Ainsi, dans l'exemple, le résultat serait

| type | filecount | prop count | 
---------------------------------- 
| zip | 3  |  2  | 
| jpg | 1  |  0  | 

je pourrais y arriver par

select f.type, (select count(id) from files where type = f.type), count(fp.id) from 
files as f, file_properties as fp where f.id = fp.file_id group by f.type; 

Mais cela semble très suboptimale et est très lent. Une meilleure façon de le faire?

Répondre

1
select type, count(*) as filecount, sum(pc.count) as [prop count] 
from Files f 
left outer join (
    select file_id, count(*) as count 
    from Properties p 
    group by file_id 
) pc on f.id = pc.file_id 
group by type 
Questions connexes