我正在学习使用MySQL,因此希望您能对此主题有所帮助。
我将首先尝试解释我的情况。我的查询涉及4个表,我想对表1 产品和2 Product_meta 中的 JOIN1 用 JOIN2 < / strong>来自表3 SalesCoupons 和4 SalesCoupons_Product
Product_meta 是一个表,其中包含许多有关Products的数据。考虑到当前情况,它具有 Product_Category_id 和 product_id (Products.id的外键)
SalesCoupons存储产品类别折扣的优惠券,但是,只有某些产品具有折扣,%来自SalesCoupons_Product表。
SalesCoupons存储 Product_Category (Product_meta.Product_Category_id的外键)和折扣 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;
答案 0 :(得分:0)
与交易无关。
此比较不能按您的意图进行
NOT IN (@products_not_discounted);
@products_not_discounted
只是一个字符串,即使用逗号分隔值也是如此
您代替
NOT IN ( SELECT cp.product_id FROM SalesCoupons_Product scp ... )