Запрос нормализованной базы данных, 3 таблицы - PullRequest
1 голос
/ 10 января 2012

У меня есть три таблицы в базе данных MySQL:

  • хранилища (PK store_id)
  • состояний (PK states_id)
  • join_stores_states (PK join_id, FK stores_id, FK states_id)

Таблица «магазины» имеет по одной строке для каждого бизнеса.Таблица join_stores_states связывает отдельную компанию с каждым состоянием, в котором она находится. Итак, у некоторых компаний есть магазины в 3 состояниях, поэтому они имеют 3 строки в join_stores_states, а у других есть магазины в 1 состоянии, поэтому у них всего 1 строка в join_stores_states.

Я пытаюсь выяснить, как написать запрос, который перечислит каждую компанию в одной строке, но все равно покажет все состояния, в которых она находится.

Вот то, что я пока имею, что, очевидно, даетмне каждый ряд из join_stores_states:

SELECT states.*, stores.*, join_stores_states.* 
FROM join_stores_states 
JOIN stores 
ON join_stores_states.stores_id=stores.stores_id 
JOIN states 
ON join_stores_states.states_id=states.states_id

В общем, это то, что он мне дает:

  • store 1 |Алабама
  • магазин 1 |Флорида
  • магазин 1 |Канзас
  • магазин 2 |Монтана
  • магазин 3 |грузия
  • магазин 3 |Вермонт

Это больше того, что я хочу видеть:

  • store 1 |Алабама, Флорида, Канзас
  • магазин 2 |Монтана
  • магазин 3 |Грузия, Вермонт

Предложения о том, какие методы запроса использовать, будут так же полезны, как и рабочий запрос.

1 Ответ

0 голосов
/ 10 января 2012

Если вам нужен список состояний в виде строки, вы можете использовать функцию MySQL GROUP_CONCAT (или эквивалентную, если вы используете другой диалект SQL), как в примере ниже. Если вы хотите выполнить какую-либо дальнейшую обработку состояний отдельно, я бы предпочел, чтобы вы выполнили запрос, как вы это сделали, а затем собрали набор результатов в более сложную структуру (хеш-таблица массивов, как простейшая мера, но более сложная OO). дизайн, безусловно, возможен) в клиенте путем итерации по полученным строкам.

SELECT stores.name,
  GROUP_CONCAT(states.name ORDER BY states.name ASC SEPARATOR ', ') AS state_names
FROM join_stores_states 
JOIN stores 
  ON join_stores_states.stores_id=stores.stores_id 
JOIN states 
  ON join_stores_states.states_id=states.states_id
GROUP BY stores.name

Кроме того, даже если вам нужна только конкатенированная строка, а не структура данных, некоторые базы данных могут не иметь функции агрегированной конкатенации, и в этом случае вам все равно придется выполнять обработку клиента. В псевдокоде, поскольку вы также не указали язык:

perform query
stores = empty hash
for each row from query results:
  get the store object from the hash by name
  if the name isn't in the hash:
    put an empty store object into the hash under the name
  add the state name to the store object's stores array
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...