2009-02-28 34 views
24

Tôi đã có một bảng 'thư mục'. Tôi muốn trả lại tất cả hồ sơ với userId của 16.Tuyên bố MySQL kết hợp tham gia và đếm?

SELECT * FROM `folders` WHERE userId = 16; 

Tôi có một bảng 'tệp'. Đối với mỗi 'thư mục' được trả về ở trên, tôi muốn trả về một số 'tệp' trong 'thư mục' đó.

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

Làm cách nào để kết hợp chúng? Tôi bị lạc. Cảm ơn!

Trả lời

13

bạn có lẽ sẽ cần phải sử dụng GROUP BY và nhóm nó bằng ID hoặc ví dụ:

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

Điều này là sai. Các cột được tham chiếu trong các thư mục. * Phải nằm trong mệnh đề GROUP BY. Tất cả các cột trong câu lệnh SELECT có GROUP BY phải nằm trong một GROUP BY hoặc một hàm tổng hợp. – alyssackwan

+0

yeah, đó là lý do tại sao tôi đang groupping bởi folders.ID (một cột là đủ để nhóm trên). – dusoft

+0

Để làm việc này, bạn cần GROUP BY tất cả các cột cần thiết từ "thư mục" được đề cập trong mệnh đề SELECT - Tôi đã thử nghiệm lý thuyết "một cột đủ để nhóm vào" và nó không đúng trong SQL Server 2005 ít nhất. –

4

Thực hiện truy vấn phụ mà nhóm theo các thư mục để có được số lượng cho mỗi thư mục, sau đó tham gia nó để là người đầu tiên truy vấn như thế này:

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 



nếu bạn không muốn sử dụng nhóm bằng cách tuyên bố.


tôi đã có một vấn đề simmilar trong một danh sách sản phẩm mà tôi muốn đếm xếp hạng sao của một sản phẩm trong một bảng [1-5] và số lượng người dùng đã bỏ phiếu cho rằng sản phẩm cụ thể.

Các vấn đề liên quan