Если предположить, что каждый магазин привязан только к одному городу, и вы забыли внешний ключ, он может выглядеть примерно так (специфично для MySQL, как я узнал ранее):
SELECT s.id, GROUP_CONCAT(u.name SEPARATOR ', ') as users,
COUNT(p.*) AS product_count
FROM stores s
JOIN city c ON s.city_id = c.id
JOIN store_managers sm ON sm.store_id = s.id
JOIN users u ON u.id = sm.user_id
JOIN products p ON p.store_id = s.id
WHERE s.owner_id = ?
GROUP BY s.id
Однако вы уже видите, что собирать все вещи нехорошо, так как вы можете извлечь только имена в пределах одной строки, или вы получите несколько строк, содержащих один и тот же store_id . Если вы действительно не хотите, чтобы имена в объединенном списке, вам придется взорвать снова, что приведет к проблемам, как только имя содержит запятую. Если вы не группируете, вам придется потом перебирать все строки с помощью PHP и манипулировать ими. Иногда лучше сделать два запроса, но это зависит от того, как вам нужны имена пользователей.
Часто при добавлении большого количества материала в один запрос вы позже столкнетесь с проблемами. В этом случае все по-прежнему поддается управлению, но как только вы захотите несколько подсчетов сразу, это может стать опасным.
Может содержать некоторые ошибки, написанные напрямую, без тестирования.