Оператор MySQL, объединяющий объединение и количество? - PullRequest
26 голосов
/ 28 февраля 2009

У меня есть таблица «папок». Я хочу вернуть все записи с идентификатором пользователя 16.

SELECT * FROM `folders` WHERE userId = 16;

У меня есть таблица «файлов». Для каждой возвращенной выше «папки» я хочу вернуть количество «файлов» в этой «папке».

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

Как мне их объединить? Я потерялся. Спасибо!

Ответы [ 4 ]

52 голосов
/ 01 марта 2009
SELECT  fol.*
 ,      (       SELECT  COUNT(*)
                FROM    files           fil
                WHERE   fil.Folder      = fol.Folder
        )       AS      "Files"
FROM    folders         fol
WHERE   fol.userId      = 16

Это называется коррелированным подзапросом.

http://dev.mysql.com/doc/refman/5.1/en/correlated-subqueries.html

15 голосов
/ 28 февраля 2009

вам, вероятно, потребуется использовать GROUP BY и сгруппировать его по идентификатору или что-то подобное:

SELECT 
    folders.*,
    COUNT(files.*) as filetotal 
FROM folders 
    LEFT JOIN files ON folders.ID=files.folderID 
WHERE userId = 16 
GROUP BY folders.ID
4 голосов
/ 28 февраля 2009

Выполните подзапрос, который группирует по папкам, чтобы получить счетчик для каждой папки, затем присоединитесь на первый запрос, как это:

    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 голосов
/ 27 мая 2011
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



, если вы не хотите использовать оператор group by.


У меня была похожая проблема в списке продуктов, когда я хотел подсчитать рейтинг продукта в другой таблице [1-5] и количество пользователей, которые проголосовали за этот конкретный продукт.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...