2009-02-28 7 views
24

Ho una tabella di "cartelle". Voglio restituire tutti i record con l'ID utente di 16.Dichiarazione MySQL che combina un join e un conteggio?

SELECT * FROM `folders` WHERE userId = 16; 

Ho una tabella di "file". Per ogni 'cartella' restituita sopra, voglio restituire un conteggio di 'file' all'interno di quella 'cartella'.

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

Come si combinano? Mi sono perso. Grazie!

risposta

13

si sarebbe probabilmente bisogno di usare GROUP BY e di gruppo che per ID o quali:

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

Questo è sbagliato. Le colonne a cui si fa riferimento nelle cartelle. * Devono essere nella clausola GROUP BY. Tutte le colonne in un'istruzione SELECT con GROUP BY devono essere in GROUP BY o in una funzione di aggregazione. – alyssackwan

+0

sì, ecco perché sto raggruppando per cartelle.ID (una colonna è sufficiente per raggruppare). – dusoft

+0

Per far funzionare tutto questo è necessario GROUP BY tutte le colonne richieste da "cartelle" menzionate nella clausola SELECT - Ho verificato la teoria di "una colonna è sufficiente per raggruppare" e non è vera in SQL Server 2005 almeno. –

4

fare una query sub che gruppi di Cartelle per ottenere il conteggio per ogni cartella, quindi unirlo alla prima query come questa:

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 



se non si desidera utilizzare il gruppo dalla dichiarazione.


ho avuto un problema del genere nel un elenco di prodotti in cui ho voluto per contare il numero di stelle di un prodotto in un altro tavolo [1-5] e del numero di utenti che hanno votato per quello specifico prodotto.