Самый простой (но не обязательно самый эффективный) способ - сделать это с помощью встроенного запроса:
SELECT ft_upload_data.*, ft_categories.*,
(SELECT COUNT(*)
FROM ft_comments c
where c.post_id = ft_upload_data.post_id) AS num_comments
FROM ft_upload_data
LEFT JOIN assigned_categories
ON assigned_categories.ft_upload_data_id = ft_upload_data.post_id
LEFT JOIN ft_categories
ON ft_categories.cat_id = assigned_categories.ft_categories_id
ORDER BY ft_upload_data.rank ASC
Более эффективным способом было бы присоединиться к таблице и группе ft_comments по post_id (при условии, что это однозначно определяет строки ft_upload_data), например, так:
SELECT ft_upload_data.post_id,
/* include the maximum of each required field from ft_upload_data and
ft_categories here, with appropriate aliases */
COUNT(*) AS num_comments
FROM ft_upload_data
LEFT JOIN assigned_categories
ON assigned_categories.ft_upload_data_id = ft_upload_data.post_id
LEFT JOIN ft_categories
ON ft_categories.cat_id = assigned_categories.ft_categories_id
LEFT JOIN ft_comments c
on c.post_id = ft_upload_data.post_id
GROUP BY ft_upload_data.post_id
ORDER BY max(ft_upload_data.rank) ASC