【发布时间】:2018-08-20 22:34:43
【问题描述】:
我正在学习使用 MySQL,因此非常感谢有关此主题的帮助。
我会先解释一下我的情况。我的查询涉及 4 个表,我想对表 1 Products 和 2 Product_meta 的 JOIN1 与 JOIN2 来自表 3 SalesCoupons 和 4 SalesCoupons_Product
Product_meta 是一个包含大量产品数据的表。就目前情况而言,它有Product_Category_id和product_id(Products.id的外键)
SalesCoupons 存储产品类别的折扣优惠券,但只有部分产品会打折,百分比来自 SalesCoupons_Product 表。
SalesCoupons store Product_Category(Product_meta.Product_Category_id 的外键)AND 折扣状态 status_id(其中状态 3 表示折扣不再可用)
SalesCoupons_Product 商店 SalesCoupons_id(SalesCoupons.id 的外键)和 Product_id(Products.id 的外键)和 Discount_prc折扣
现在,我需要创建一个报告,显示在任何给定产品类别中未打折的产品
这是我写的
BEGIN;
SET @products_not_discounted := (SELECT GROUP_CONCAT(scp.product_id) FROM SalesCoupons_Product scp, SalesCoupons sc WHERE scp.SalesCoupons_id=sc.id AND sc.status_id<3 AND sc.product_category_id=:product_category_id GROUP BY scp.SalesCoupons_id);
SELECT p.id,p.name FROM Products p, Product_meta pm WHERE pm.product_id=p.id AND pm.product_category_id=:product_category_id AND p.id NOT IN (@products_not_discounted);
COMMIT;
我的问题是我似乎无法在 MySQL Transaction 中使用 GROUP_CONCAT
例如,如果“非折扣产品”的 ID 为 15、25、35、48,则查询结果将考虑忽略 15,但不会忽略其余的任何一个
我创建了另一个使用嵌套 SQL 的解决方案,但想了解为什么 Transaction 不起作用
对我有用的解决方案查询如下:
SELECT p.id,p.name,
(SELECT Discount_prc FROM SalesCoupons_Product scp,SalesCoupons sc WHERE scp.SalesCoupons_id=sc.id AND sc.status_id<3 AND scp.product_id=p.id ORDER BY scp.id DESC LIMIT 1) as Discount_prc
FROM Products p, Product_meta pm
WHERE pm.product_id=p.id AND pm.product_category_id=:product_category_id
HAVING Discount_prc IS NULL;
【问题讨论】:
-
FROM Products p, Product_meta pm使用INNER JOIN子句逗号连接语法已超过 30 年.. -
推广使用 explict
JOINsintaxis,Aaron Bertrand 写了一篇很好的文章 Bad habits to kick : using old-style JOINs 关于它。
标签: mysql