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

Mysql 查询规范化数据库,3个表,mysql,sql,join,Mysql,Sql,Join,我在MySQL数据库中有三个表: 门店主键门店号 状态PK状态_id 连接存储区\状态PK连接id、FK存储区\ id、FK状态\ id stores表中的每项业务都有一行。join_stores_states表将单个企业链接到其所在的每个州。所以,一些企业在3个州有商店,所以他们在join_stores_州有3行,而其他企业在1个州有商店,所以他们在join_stores_州只有1行 我试图找出如何编写一个查询,将每个业务列在一行中,但仍然显示它所处的所有状态 到目前为止,这是我所拥有的,很明

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

门店主键门店号 状态PK状态_id 连接存储区\状态PK连接id、FK存储区\ id、FK状态\ id stores表中的每项业务都有一行。join_stores_states表将单个企业链接到其所在的每个州。所以,一些企业在3个州有商店,所以他们在join_stores_州有3行,而其他企业在1个州有商店,所以他们在join_stores_州只有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号店|佛蒙特州佐治亚州
关于尝试哪种查询方法的建议与工作查询一样受欢迎。

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

您使用的是什么风格的数据库和版本?基于特定供应商的SQL有不同的解决方案。这可能很有用:是的,这是MySQL中的group_concat,但在SQL Server.MySQL db中非常笨拙,谢谢您的链接,它正好指向了我想要去的地方。它只列出第一个存储,并将属于其他存储的每个状态都放入其中,但这只是一个开始。非常感谢哦,忘了一个重要的部分。现在试试。