【问题标题】:How to correct column name values in MySQL multiple JOINS query如何更正 MySQL 多个 JOINS 查询中的列名值
【发布时间】:2020-08-23 16:44:28
【问题描述】:

我需要显示产品及其价格,以及该产品的当前库存(如果有)以及特定颜色和属性。它部分地做了它应该做的事情。这是查询的解释(或至少它应该做什么):

  • store_product获取产品基本信息
  • 产品有库存。该库存与颜色 ID 和属性详细信息 ID 相关联。
  • 与颜色 ID 关联的产品库存可以有多个属性详细信息 ID。因此,例如,涤纶材料的红色衬衫库存值可能与 M 码的红色衬衫库存值不同。

对于这个特定示例,我正在尝试接收满足这些特定值的产品 ID 59 的库存值

  • id_color 必须是 1(1 = red,它有一个名为 red deadpool 的自定义名称)
  • id_detail 必须是 4 在一行中,50 在另一行中(4 = 尺寸 M / 50 = 材料涤纶)李>

这是我目前收到的:

查询部分正确,因为:

  • 我得到了 2 行,每个颜色/属性组合一个
  • 我得到了每一行的正确id_stock ID,并且我还得到了颜色/属性组合的正确库存值。

问题是,虽然股票信息是正确的,但id_attribute / attribute / id_detail / detail 信息是错误的。

这是我需要收到的(我已将更正标记为粗体):

SELECT store_product.id_product             AS id_product, 
       store_product.NAME                   AS NAME, 
       store_product.price                  AS price, 
       store_product.flg_stock              AS flg_stock, 
       store_product_stock.id               AS id_stock, 
       store_product_stock.stock            AS stock, 
       Ifnull(store_color.NAME, color.NAME) AS color, 
       color.hex                            AS hex, 
       store_attribute.id_attribute         AS id_attribute, 
       store_attribute.NAME                 AS attribute, 
       store_attribute_detail.id_detail     AS id_detail, 
       store_attribute_detail.NAME          AS detail 
FROM   store_product 
       LEFT JOIN store_product_color 
              ON store_product_color.id_color = store_product_color.id_color 
       LEFT JOIN color 
              ON color.id_color = store_product_color.id_color 
       LEFT JOIN store_color 
              ON store_color.id_color = color.id_color 
                 AND store_color.id_store = 1 
       LEFT JOIN store_product_detail 
              ON store_product_detail.id_product = store_product.id_product 
       LEFT JOIN store_attribute_detail 
              ON store_attribute_detail.id_detail = 
                 store_product_detail.id_detail 
       LEFT JOIN store_attribute 
              ON store_attribute.id_attribute = 
                 store_attribute_detail.id_attribute 
       LEFT JOIN store_product_stock 
              ON store_product_stock.id_product = store_product.id_product 
                 AND store_product_stock.id_color = 1 
                 AND store_product_stock.id_detail IN( 4, 50 ) 
WHERE  store_product.id_store = 1 
       AND store_product.id_product = 59 
       AND store_product_color.id_color = 1 
GROUP  BY store_product_stock.id 

在这里你可以找到整个表结构和当前有问题的查询:sqlfiddle

关于如何解决问题的任何想法?谢谢!

【问题讨论】:

  • 你的样本数据集真的“最小”吗?
  • 这里的大多数人都希望样本表数据和预期结果为格式化文本,而不是图像。也看看minimal reproducible example
  • @jarlh 嗨,图片仅供参考,sqlfiddle 包含全文格式的版本。关于列,我删除了所有不必要的内容。由于该示例使用多个连接,我不想删除它们。如果我这样做了,这个问题很容易重现。
  • 您的 GROUP BY 无效,并且会在较新的 MySQL 版本中引发异常,除非在兼容模式下。 MySQL 版本 8 有窗口函数,也许是你想要的。
  • @jarlh 服务器正在使用 mysql 5.6,对此无能为力。

标签: mysql join group-by left-join mysql-5.6


【解决方案1】:

正如你所说:

产品有库存。该库存与颜色 ID 和属性详细信息 ID 相关联。

在您的查询中,您的产品与您的color_id 和您的attribute_detail 直接相关。 您将属性直接与您的 store_product 相关联,而不是与您的 color/stock 相关联。

这意味着你的 id_attribute 和属性只依赖于store_product.id_product 而不是你的store_product_stock.id

编辑 首先,感谢 sqlfiddle。 链接您的股票和详细信息的方法是使用store_attribute_detail.id_detail = store_product_stock.id_detail

FROM   store_product 
       LEFT JOIN store_product_color 
              ON store_product_color.id_color = store_product_color.id_color 
       LEFT JOIN color 
              ON color.id_color = store_product_color.id_color 
       LEFT JOIN store_color 
              ON store_color.id_color = color.id_color 
                 AND store_color.id_store = 1 

       LEFT JOIN store_product_stock 
              ON store_product_stock.id_product = store_product.id_product 
                 AND store_product_stock.id_color = 1 
                 AND store_product_stock.id_detail IN( 4, 50 ) 

       LEFT JOIN store_attribute_detail 
              ON store_attribute_detail.id_detail = 
                 store_product_stock.id_detail 
       LEFT JOIN store_attribute 
              ON store_attribute.id_attribute = 
                 store_attribute_detail.id_attribute 
        LEFT JOIN store_product_detail 
              ON store_product_detail.id_product = store_product.id_product 
+------------+--------------------------+-------+-----------+----------+-------+--------------+--------+--------------+-----------+-----------+-----------+
| id_product |           NAME           | price | flg_stock | id_stock | stock |    color     |  hex   | id_attribute | attribute | id_detail |  detail   |
+------------+--------------------------+-------+-----------+----------+-------+--------------+--------+--------------+-----------+-----------+-----------+
|         59 | Camiseta Júbilo de X-men |  55.1 |         1 |      112 |     5 | red deadpool | f44336 |            1 | Size      |         4 | M         |
|         59 | Camiseta Júbilo de X-men |  55.1 |         1 |      118 |    35 | red deadpool | f44336 |            8 | Material  |        50 | Poliester |
+------------+--------------------------+-------+-----------+----------+-------+--------------+--------+--------------+-----------+-----------+-----------+

【讨论】:

  • 我们知道表格的结构
  • 我们不知道 store_attribute_detail 是否有 stock_id 列,但对于它应该有的定义。
  • 我们知道它没有
  • @CarlosSR sqlfiddle 列出了模式中的所有表和列。如果你愿意,我也可以在原帖中列出它们?
  • 我的错,没有看到 cmets 中的小提琴。马上检查
猜你喜欢
  • 1970-01-01
  • 2016-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-11
  • 2012-11-13
  • 2016-02-07
  • 1970-01-01
相关资源
最近更新 更多