【发布时间】: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_stockID,并且我还得到了颜色/属性组合的正确库存值。
问题是,虽然股票信息是正确的,但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