2012-01-10 36 views
1

我有一个MySQL数据库三个表:查询规范化的数据库,3个表

  • 店(PK stores_id)
  • 状态(PK states_id)
  • join_stores_states(PK join_id,FK stores_id,FK states_id )

“stores”表对于每个业务都有一行。 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 |佛蒙特州乔治亚州

关于要尝试哪种查询方法的建议与正在运行的查询一样。

+0

我认为这是一个dublicate – 2012-01-10 17:21:56

+3

您使用的是哪种数据库和版本?基于特定供应商的SQL有多种解决方案。 – 2012-01-10 17:22:26

+0

这可能很有用:http:// stackoverflow。com/questions/194852/concatenate-many-rows-into-a-single-text-string – 2012-01-10 17:25:07

回答

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 
+0

这正是我想去的地方。它只列出第一家商店,并将属于其他商店的每一个国家放入其中,但这只是一个开始。非常感谢 – robbievasquez 2012-01-10 17:56:35

+0

Doh,忘了一个重要部分('GROUP BY')。现在试试。 – Amadan 2012-01-10 17:59:52

+0

这样做!谢谢你,谢谢你,那很完美。 – robbievasquez 2012-01-10 18:02:40