在MySQL事务中使用GROUP_CONCAT

时间:2018-08-14 18:59:07

标签: mysql

我正在学习使用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;

1 个答案:

答案 0 :(得分:0)

与交易无关。

此比较不能按您的意图进行

NOT IN (@products_not_discounted);

@products_not_discounted只是一个字符串,即使用逗号分隔值也是如此

您代替

NOT IN ( SELECT cp.product_id FROM SalesCoupons_Product scp ... )