SELECT stores.ID, store_info.display_name, store_info.address,store_info.phone,
IFNULL(
GROUP_CONCAT(DISTINCT storeBrands.display_name ORDER BY storeBrands.name),
GROUP_CONCAT(chainBrands.display_name ORDER BY chainBrands.name)
) AS brands,
IFNULL(
GROUP_CONCAT(DISTINCT storeFilters.name ORDER BY storeFilters.name),
GROUP_CONCAT(DISTINCT chainFilters.name ORDER BY chainFilters.name)
) AS filters
FROM stores
LEFT JOIN store_info ON stores.ID = store_info.storeID
LEFT JOIN store_brands ON stores.ID = store_brands.store
LEFT JOIN chain_brands ON stores.chainID = chain_brands.chain
LEFT JOIN brands AS storeBrands ON store_brands.brand = storeBrands.ID
LEFT JOIN brands AS chainBrands ON chain_brands.brand = chainBrands.ID
LEFT JOIN store_filters ON stores.ID = store_filters.store
LEFT JOIN chain_filters ON stores.chainID = chain_filters.chain
LEFT JOIN filters AS storeFilters ON store_filters.filter = storeFilters.ID
LEFT JOIN filters AS chainFilters ON chain_filters.filter = chainFilters.ID
WHERE stores.city = 1
GROUP BY stores.ID
我更新了这个问题,因为我自己已经解决了最初的问题,但还有一个问题:
我该如何改进? 我觉得我已经取得了很多的进步。我已经从使用子查询进行联合,到使用子查询进行单个查询,再到改进我的联接,直到我不再需要为每一行执行子查询。
不过,感觉还是可以做得更好。我对自己的加入非常没有安全感。 有人有改进的建议吗?
目标:
我希望此查询从层次结构中获取结果。我们有“ parent ”(链式店),他们与自己的 child (商店)共享相同的品牌和过滤器(以及其他东西)。这个想法是让“ child ”继承 parent 的设置作为后备,但当它开始设置自己的数据时完全忽略它。
因此,基本上,对于一个查询,您需要“要么这个数据,要么那个数据”,而不是两者都需要。非此即彼。 (UNION
不太适合的另一个原因)
最佳答案
如果您只在商店没有链式店时才想要该链式店,请制定一个 UNION。 UNION 的一个操作数将主数据连接到存储数据,而另一个操作数(仅当存储没有时才实例化)将主数据连接到链数据。这就是人们使用 UNION 的原因:“我有时想要这些,有时又想要那些。”
关于MYSQL - 左连接双重关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38312895/