2009-02-28 8 views
24

Tengo una tabla de 'carpetas'. Quiero devolver todos los registros con el ID de usuario de 16.declaración de MySQL combinando un join y un conteo?

SELECT * FROM `folders` WHERE userId = 16; 

Tengo una tabla de 'archivos'. Para cada 'carpeta' devuelta anteriormente, deseo devolver un recuento de 'archivos' dentro de esa 'carpeta'.

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

¿Cómo combino estos? Estoy perdido. ¡Gracias!

Respuesta

13

es probable que necesite usar GROUP BY y el grupo que por ID o tal:

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

Esto está mal. Las columnas a las que se hace referencia en las carpetas. * Tienen que estar en la cláusula GROUP BY. Todas las columnas en una instrucción SELECT con un GROUP BY tienen que estar en un GROUP BY o en una función agregada. – alyssackwan

+0

sí, es por eso que estoy agrupando por carpetas.ID (una columna es suficiente para agrupar). – dusoft

+0

Para que esto funcione, deberá agrupar por todas las columnas requeridas de "carpetas" que se mencionan en la cláusula SELECT - Probé la teoría de "una columna es suficiente para agrupar" y no es verdad en SQL Server 2005 al menos. –

4

realizar una consulta sub que los grupos de las carpetas para obtener el recuento por carpeta, a continuación, unirse a ella a la primera consulta como esta:

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 no desea utilizar el grupo por la declaración.


que tenía un problema de parecida en una lista de productos en lo que quería contar el número de estrellas del producto en otra tabla [1-5] y la cantidad de usuarios que votaron por ese producto específico.