MySQL - получение информации из четырех таблиц в одном запросе - PullRequest
0 голосов
/ 16 января 2012

Это структура данных:

stores          { id, name, city_id, owner_id }
cities          { id, name }
store_managers  { user_id, store_id }
products        { id, name, store_id }
users           { id, name }
_______________________________________
#note: many users can manage the same store, and the same user can manage 
 many stores.

Мне нужно в одном запросе получить:

  1. Хранилища, принадлежащие пользователю, которые я предоставлю своим идентификатором.[из магазинов, когда owner_id = some_number]
  2. Для каждого магазина также привязан город.[из городов]
  3. Пользователи, имеющие права доступа к магазину.[из store_managers]
  4. СЧЕТ продуктов, назначенных каждому магазину.

Мне нужно, чтобы он был в одном запросе.БД MYSQL


исправлена, добавлен недостающий внешний ключ, моя ошибка, спасибо

1 Ответ

1 голос
/ 16 января 2012

Если предположить, что каждый магазин привязан только к одному городу, и вы забыли внешний ключ, он может выглядеть примерно так (специфично для 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 и манипулировать ими. Иногда лучше сделать два запроса, но это зависит от того, как вам нужны имена пользователей.

Часто при добавлении большого количества материала в один запрос вы позже столкнетесь с проблемами. В этом случае все по-прежнему поддается управлению, но как только вы захотите несколько подсчетов сразу, это может стать опасным.

Может содержать некоторые ошибки, написанные напрямую, без тестирования.

...