查询规范化数据库,3个表

时间:2012-01-10 17:20:10

标签: mysql sql join

我在MySQL数据库中有三个表:

  • 商店(PK stores_id)
  • 州(PK states_id)
  • join_stores_states(PK join_id,FK stores_id,FK states_id)

“商店”表每个商家都有一行。 join_stores_states表将单个业务链接到它所处的每个状态。因此,一些企业在3个州拥有商店,因此它们在join_stores_states中有3行,而其他商店在1个州有商店,因此它们在join_stores_states中只有1行。

我正在试图弄清楚如何编写一个查询,列出一行中的每个业务,但仍然显示它所在的所有状态。

这是我到目前为止所拥有的,显然是给了我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

很容易,这就是它给我的东西:

  • 商店1 |阿拉巴马
  • 商店1 |佛罗里达
  • 商店1 |堪萨斯
  • 商店2 |蒙大拿
  • 商店3 |佐治亚
  • 商店3 |佛蒙特

这更像是我想看到的:

  • 商店1 |阿拉巴马州,佛罗里达州,堪萨斯州
  • 商店2 |蒙大拿
  • 商店3 |格鲁吉亚,佛蒙特州

关于尝试哪种查询方法的建议与工作查询一样受欢迎。

1 个答案:

答案 0 :(得分:0)

如果您需要将状态列表作为字符串,则可以使用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