Оператор MySQL, объединяющий объединение и подсчет?

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

SELECT * FROM `folders` WHERE userId = 16;

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

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

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


person Corey    schedule 28.02.2009    source источник


Ответы (4)


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

person jennykwan    schedule 01.03.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
person dusoft    schedule 28.02.2009
comment
Это не правильно. Столбцы, на которые есть ссылки в папках *, должны быть в предложении GROUP BY. Все столбцы в операторе SELECT с GROUP BY должны быть либо в GROUP BY, либо в агрегатной функции. - person jennykwan; 01.03.2009
comment
да, именно поэтому я группирую по folders.ID (достаточно одного столбца для группировки). - person dusoft; 01.03.2009
comment
Чтобы заставить это работать, вам нужно будет ГРУППИРОВАТЬ все необходимые столбцы из папок, которые упомянуты в предложении SELECT - я проверил теорию о том, что одного столбца достаточно для группировки, и это неверно, по крайней мере, в SQL Server 2005. - person Rich Andrews; 02.03.2009
comment
В любом случае никогда не рекомендуется использовать SELECT *, а явно указать все столбцы, которые должны быть возвращены. - person Rich Andrews; 02.03.2009
comment
у него было там * в его первоначальном запросе, я не знаю, как выглядит его таблица, так что перестаньте троллить и используйте свой ум для чего-то творческого. - person dusoft; 02.03.2009
comment
Сладкий синтаксический сахар: ‹dev.mysql.com /doc/refman/5.0/en/group-by-hidden-columns.html›. Это научит меня говорить о продукте, которым я не пользуюсь каждый день. - person jennykwan; 03.03.2009
comment
Я считаю, что это более классический подход к SQL. Красиво, и работает отлично. - person Johan; 26.07.2013

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

    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
person Ron Savage    schedule 28.02.2009

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] и количество пользователей, проголосовавших за этот конкретный продукт.

person vortex    schedule 27.05.2011