我在MySQL数据库中有三个表:
“商店”表每个商家都有一行。 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
很容易,这就是它给我的东西:
这更像是我想看到的:
关于尝试哪种查询方法的建议与工作查询一样受欢迎。
答案 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