MYSQL - 左连接双重关系?

标签 mysql

    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/

相关文章:

mysql - 使用 mysql count() 或 num_rows 的更好方法

c# - 我如何在 EF Code First 中声明数据类型为 Medium Blob 的表上的字段

mysql - 使用 Propel ORM 从 Symfony 中的现有数据库错误生成模型

mysql - 我应该为唯一名称表中的每一行提供行 ID 吗?

mysql - 如何在nodejs中执行sequelize批量插入

mysql - winform查询中需要什么连接打开和关闭执行?

如果有两种语言,MySQL 从表中选择一个值

mysql - 使用 MySQL 创建循环排列的优雅方法

mysql - MySQL 中的时间旅行 View

php - 使用 for 循环的性能 MySQL 查询