【问题标题】:How to correctly separate this query如何正确分离此查询
【发布时间】:2020-08-11 22:39:47
【问题描述】:

我正在尝试对我的表格进行排序,以查找我的订单中经常出现的类别。进行此查询后

SELECT 
  ccd.cart_id, 
  mp.category_name, 
  ccd.quantity 
FROM 
  customer_orders co
  JOIN customer_cart_dtls ccd
    ON co.order_cart = ccd.cart_id
  JOIN merchant_products mp
    ON ccd.product_id = mp.product_id

产生这个结果

所以从那个查询中购物车 #2006........63 有 9 件商品。 1 来自食物,3 来自水果,2 来自清洁,3 来自零食。除了第二个清洁条目有两个之外,所有这些都是数量 1。如何更改我的查询,以便获得 10 个数量均为 1 的项目?

看起来像这样

【问题讨论】:

  • 所以您只想要数量为 1 的商品?而且您还想要最多 10 件物品,对吗? WHERE co.created_on BETWEEN '2020-07-01' AND '2020-07-31' AND quantity = 1 LIMIT 10 怎么样。如果这不是你的意思,请解释得更清楚
  • 我想要做的是将数量为 1+ 的商品作为一行添加到该购物车中。因此,cart_id 不是有 9 个项目,而是有 10 个项目,因为具有 qty 2 的清洁行现在分为两行清洁。关于 where 子句,我编辑了问题,因为手头的问题无关紧要:)
  • 好的。如果可以,请显示一些示例源数据和显示预期结果的表格,将对每个人都有很大帮助。
  • 请使用问题下方的“编辑”按钮来编辑包含额外信息的主帖。评论不是埋葬与您的问题相关的重要信息的地方。此外,示例源数据也会有所帮助,因此我们可以更轻松地看到需要进行哪些转换。谢谢。

标签: mysql sql


【解决方案1】:

您希望将各个行拆分为多行。一种方法使用递归 CTE:

WITH RECURSIVE t as (
      SELECT ccd.cart_id, mp.category_name, ccd.quantity 
      FROM customer_orders co JOIN
           customer_cart_dtls ccd
           ON co.order_cart = ccd.cart_id JOIN
           merchant_products mp
           ON ccd.product_id = mp.product_id
     ),
     cte as (
      SELECT cart_id, category_name, quantity, 1 as n
      FROM t
      UNION ALL
      SELECT cart_id, category_name, quantity, n + 1
      FROM cte
      WHERE n < quantity
    )
SELECT cart_id, category_name, 1 as quantity
FROM cte;

Here 是一个 dbfiddle。

编辑:

您可以加入数量列表——如果您有某种类型的计数表会更容易:

SELECT ccd.cart_id, mp.category_name, 1 as quantity 
FROM customer_orders co JOIN
     customer_cart_dtls ccd
     ON co.order_cart = ccd.cart_id JOIN
     merchant_products mp
     ON ccd.product_id = mp.product_id JOIN
     (SELECT 1 as n UNION ALL
      SELECT 2 as n UNION ALL
      SELECT 3 as n UNION ALL
      SELECT 4 as n UNION ALL
      SELECT 5 as n 
     ) n
     ON n.n <= ccd.quantity;

您还可以使用现有表中的变量构建表(如果它足够大):

(select (@rn := @rn + 1) as n
 from customer_orders cross join
      (select @rn := 0) params
 limit 100  -- say that 100 is big enough
) n

【讨论】:

  • 谢谢!我尝试运行它,但我正在使用 mariadb 并且出现语法错误。有没有其他方法可以做到这一点?由于我无法更改任何设置,因为这是一个工作数据库
  • @Neykof。 . .它应该在 MariaDB 中运行良好。我添加了一个 dbfiddle.
  • 当我尝试运行它时,我得到了这个,Error Code: 1064. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'RECURSIVE t as ( SELECT ccd.cart_id, mp.category_name, ccd.quantity ' at line 1 0.062 sec
  • 我正在运行 mySQL 5.7,this 是我在 dbfiddle 在 5.7 上运行它时得到的结果
  • @Neykof。 . .这需要 MySQL 8+,如 dbfiddle 所示。
【解决方案2】:

您是否试图通过将每个项目分成单独的行然后使用COUNT 来计算每个类别有多少项目?如果是这样,我认为您不一定需要走那条路。在按category_name 分组后,简单地使用SUM 聚合函数可能会容易得多。它可能看起来像这样:

SELECT mp.category_name, SUM(ccd.quantity)
FROM customer_orders AS co
JOIN customer_card_dtls AS ccd ON co.order_cart = ccd.cart_id
JOIN merchant_products AS mp ON ccd.product_id = mp.product_id
GROUP BY mp.category_name

如果您还想查看购物车 ID,只需将适当的列添加到您的 SELECTGROUP BY 语句中

【讨论】:

  • 谢谢!我不需要查看每个类别有多少商品,我想拆分它们,因为我想查看所有订单中创建的频繁组合。 such as this example
猜你喜欢
  • 2021-01-16
  • 1970-01-01
  • 2017-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多