Инструкция MySQL, объединяющая соединение и счетчик?
У меня есть таблица "папок". Я хочу вернуть все записи с userId из 16.
SELECT * FROM `folders` WHERE userId = 16;
У меня есть таблица "файлов". Для каждой "папки", возвращенной выше, я хочу вернуть количество "файлов" в эту "папку".
SELECT COUNT(*) as "Files" FROM files WHERE Folder = n;
Как их объединить? Я потерялся. Спасибо!
Ответы
Ответ 1
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
Ответ 2
вам, вероятно, понадобится использовать GROUP BY и сгруппировать его по ID или тому подобное:
SELECT
folders.*,
COUNT(files.*) as filetotal
FROM folders
LEFT JOIN files ON folders.ID=files.folderID
WHERE userId = 16
GROUP BY folders.ID
Ответ 3
Сделайте вспомогательный запрос, который группирует по Folders, чтобы получить подсчет для каждой папки, затем присоедините его
к первому запросу вроде этого:
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
Ответ 4
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] и количество пользователей, голосовавших за этот конкретный продукт.