2009-02-28 10 views
24

J'ai une table de 'dossiers'. Je veux retourner tous les enregistrements avec l'ID utilisateur de 16.Instruction MySQL combinant une jointure et un compte?

SELECT * FROM `folders` WHERE userId = 16; 

J'ai une table de 'fichiers'. Pour chaque 'dossier' retourné ci-dessus, je veux retourner le nombre de 'fichiers' dans ce 'dossier'.

SELECT COUNT(*) as "Files" FROM files WHERE Folder = n; 

Comment les combiner? Je suis perdu. Merci!

Répondre

13

vous auriez probablement besoin d'utiliser GROUP BY et le groupe par ID ou tel:

SELECT 
    folders.*, 
    COUNT(files.*) as filetotal 
FROM folders 
    LEFT JOIN files ON folders.ID=files.folderID 
WHERE userId = 16 
GROUP BY folders.ID 
+1

Ceci est faux. Les colonnes référencées dans les dossiers. * Doivent être dans la clause GROUP BY. Toutes les colonnes d'une instruction SELECT avec un GROUP BY doivent être dans un GROUP BY ou une fonction d'agrégat. – alyssackwan

+0

ouais, c'est pourquoi je suis groupping par dossiers.ID (une colonne est suffisante pour le groupe). – dusoft

+0

Pour que cela fonctionne, vous devez GROUP BY toutes les colonnes requises de "dossiers" qui sont mentionnés dans la clause SELECT - j'ai testé la théorie de "une colonne est suffisante pour le groupe" et ce n'est pas vrai dans SQL Server 2005 au moins. –

4

Faites une requête sous que les groupes par les dossiers pour obtenir le nombre par dossier, puis rejoindre au premier requête comme ceci:

select 
     f.* 
     fc.Files 
    from 
     Folders f 
-- 
     -- Join the sub query with the counts by folder  
     JOIN (select 
       Folder, 
       count(*) Files 
      from 
       files 
      group by 
       Folder) as fc 
      on (fc.Folder = f.Folder) 
    where 
     f.userid = 16 
2
select 
    f.`folder`, 
    f.`userId`, 
    r.`count` 

from 
    `folders` f 
    left join 
    (
     select 
      `Folder`, 
      count(`id`) `count` 

     from `files` 

      group by `Folder` 
    ) r 
     on r.`Folder`=f.`folder` 

where 
    `userId`=16 



si vous ne voulez pas utiliser le groupe par déclaration.


i avait un problème simmilar dans une liste de produits où je voulais compter le nombre d'étoiles d'un produit dans une autre table [1-5] et le nombre d'utilisateurs qui ont voté pour ce produit spécifique.