首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >查询规范化数据库,3个表

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

Stack Overflow用户
提问于 2012-01-10 17:20:10
回答 1查看 926关注 0票数 1

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

stores_id)

  • states (PK states_id)

  • join_stores_states (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之外的每一行:

代码语言:javascript
复制
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

粗略地说,这就是它给我的东西:

alabama

  • store 1\x{e76f}堪萨斯

  • 商店2\x{e76f}\x{e76f} georgia

  • store 3\x{e76f}佛蒙特州

这是我更想看到的:

  • 商店1\x{e76f}阿拉巴马州,佛罗里达州,堪萨斯州
  • 商店2\x{e76f}佐治亚州,佛蒙特州

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-01-10 17:27:54

如果您需要将状态列表作为字符串,则可以使用MySQL的GROUP_CONCAT函数(或者,如果您使用的是另一种SQL方言),如下面的示例所示。如果您想单独对状态进行任何类型的进一步处理,我希望您像以前一样运行查询,然后通过迭代生成的行,将结果集收集到一个更复杂的结构中(作为最简单的度量,数组的哈希表,但更复杂的OO设计当然是可能的)。

代码语言:javascript
复制
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

此外,即使您只需要连接字符串,而不需要数据结构,一些数据库可能没有聚合连接函数,在这种情况下,您将不得不进行客户端处理。在伪代码中,因为您也没有指定一种语言:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8807547

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档