【问题标题】:using GROUP_CONCAT in MySQL Transaction在 MySQL 事务中使用 GROUP_CONCAT
【发布时间】:2018-08-20 22:34:43
【问题描述】:

我正在学习使用 MySQL,因此非常感谢有关此主题的帮助。

我会先解释一下我的情况。我的查询涉及 4 个表,我想对表 1 Products 和 2 Product_metaJOIN1JOIN2 来自表 3 SalesCoupons 和 4 SalesCoupons_Product

Product_meta 是一个包含大量产品数据的表。就目前情况而言,它有Product_Category_idproduct_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 JOIN sintaxis,Aaron Bertrand 写了一篇很好的文章 Bad habits to kick : using old-style JOINs 关于它。

标签: mysql


【解决方案1】:

与交易无关。

这种比较不符合您的意图

NOT IN (@products_not_discounted);

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

你会这样做

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

【讨论】:

    猜你喜欢
    • 2014-03-09
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 2012-07-28
    • 2012-11-07
    • 2012-10-25
    • 1970-01-01
    相关资源
    最近更新 更多