【问题标题】:Getting SUM of 2 Values (1 being in SubQuery) in MySQL在 MySQL 中获取 2 个值的总和(1 个在子查询中)
【发布时间】:2015-05-20 10:14:41
【问题描述】:

我对这个(应该很简单)问题束手无策。我想我已经完成了所有的艰苦工作(因为这个 MySQL SELECT 语句相当复杂,恕我直言(无论如何对我来说)。

我正在尝试从 MySQL SELECT 语句中获取两个关键数字字段的 SUM 值。我已经尝试了明显的变化,但是我无法使子查询中的字段值“Regs”可用于父查询来执行类似... SUM(Regs+Held) AS Total 的操作。请,请,帮助!

这是我的 SQL 代码...

选择 p.product_id AS ID, FROM_UNIXTIME(p.cdate, '%c/%e/%y') AS CDate, FROM_UNIXTIME(p.mdate, '%c/%e/%y') AS MDate, p.product_sku 作为 SKU, s.mf_category_city AS 镇, s.mf_category_county AS 县, s.mf_category_state AS 状态, org.mf_name 作为组织, s.mf_category_name AS 站点, p.product_name AS 类名, DATE_FORMAT(p.startDate, '%a %m-%d-%Y') AS StartDate, DATE_FORMAT(p.endDate, '%a %m-%d-%Y') AS EndDate, DATE_FORMAT(p.startTime, '%l:%i %p') 作为开始时间, DATE_FORMAT(p.endTime, '%l:%i %p') 作为结束时间, p.age_from, page_to, pr.product_price AS 价格, 案子 当 p.class_status = 0 THEN 'A' 当 p.class_status = 1 THEN 'C' 当 p.class_status = 2 THEN 'S' 结束作为状态, p.product_publish AS 已发布, p.precode AS 代码, 案子 当 p.product_refered = 'N' THEN 'USG' 当 p.product_refered = 'Y' THEN 'REC' 当 p.product_refered = 'B' THEN 'BOTH' 以 REC 结束, p.class_target 作为目标, (从(jos_sport_childs_xrf AS scx)中选择总和(oi.product_quantity) 左连接 jos_vm_order_item AS oi ON scx.product_id = oi.product_id 其中 scx.product_id = p.product_id AND oi.order_status IN ('C','P') GROUP BY scx.child_id LIMIT 1) 作为注册, p.class_held AS 持有, p.total_registrations AS 总计, p.site_usage_fee AS 费用, p.player_usage_fee AS PlayerFee, p.player_usage_percent 作为玩家百分比, u.name AS RD, p.product_desc AS 注释, 案子 当 cxref.category_parent_id = 42 那么'USSI' 当 cxref.category_parent_id = 98 THEN 'USSI' 结束作为公司, p.belongs_to AS BelongsTo, p.missdate1 作为 Missdate1, p.missdate2 作为 Missdate2, p.missdate3 作为 Missdate3 FROM (jos_vm_product AS p) INNER JOIN jos_vm_manufacturer_category AS s ON p.venue = s.mf_category_id 左加入 jos_vm_product_price AS pr ON pr.product_id = p.product_id INNER JOIN jos_users AS u ON p.user_id = u.id 内部连接 ​​jos_vm_product_category_xref AS x ON p.product_id = x.product_id 内部连接 ​​jos_vm_category_xref AS cxref ON x.category_id = cxref.category_child_id 左加入 jos_vm_manufacturer AS org ON s.mf_category_org = org.manufacturer_id WHERE p.startDate BETWEEN '2015-03-02' AND '2015-06-14' AND x.category_id IN (102,120,99,106,104,94,59,84,105) 并且 u.id 不在 (33731,46660)

Held 有一个简单的数值,SubQuery 返回记录的 SUM 总值。

【问题讨论】:

  • LIMIT 1 是做什么的?为什么在子查询中使用 OUTER JOIN?
  • 另外,请注意,分开存储日期和时间通常是个坏主意
  • FWIW,我倾向于避免相关子查询。相反,您可以通过在子查询的 SELECT 子句中包含 scx.child_id 来将其作为不相关的子句加入,然后加入该子句。不知道这是否对你有很大帮助,但我认为它可能会。
  • 感谢您到目前为止的 cmets... MySQL 确实显得过于复杂,但这是必要的。这个项目的数据结构一直很复杂。 LIMIT 1 是必要的,因为我们无法在“Regs”中获得正确的 SUM 值。我知道这暗示了另一个问题,我将在以后研究改进 SQL,但现在这就是我必须使用的全部内容,因为它已经是 7 年的实时系统了。我也想避免相关的子查询,但是目前我看不到明确的出路(鉴于我必须解决的时间很短)。
  • 我将在没有“LIMIT 1”的情况下进行测试,以提醒自己问题所在。

标签: mysql select sum


【解决方案1】:

让我们单独看一下子查询,没有相关引用,所以...

SELECT SUM(oi.product_quantity) 
     , scx.product_id
  FROM jos_sport_childs_xrf scx
  JOIN jos_vm_order_item oi 
    ON scx.product_id = oi.product_id 
 WHERE oi.order_status IN ('C','P')     
 GROUP 
    BY scx.child_id;

这里我们SELECTproduct_id(我们这样做是因为我们知道以后会需要它),但我们GROUP BYchild_id。这是不好的。我们应该怎么做?

【讨论】:

  • 如上一条评论中所述,我删除了 LIMIT 1 以提醒自己子查询中的前一个错误... [Err] 1242 - 子查询返回多于 1 行所以我知道有些东西不是与子查询相当,但是使用 LIMIT 1 它确实返回正确的值作为“Regs”,这在输出中可见。但是无法获得 Regs + Held = ??? 的总价值
  • 如果它返回了正确的答案,它是幸运的!不应依赖这种方法。
  • 我仍然不知道子查询有什么问题?我可以使用该子查询正确计算超过 3,500 条记录的总数。我只是无法将返回的值添加到总计的“保留”整数中。
  • 正如我试图解释的那样,您选择一件事,但按另一件事分组。您声称这给出了正确的答案,但除非 child_id 和 product_id 都是唯一的,否则在我看来这很荒谬。
猜你喜欢
  • 2012-09-22
  • 2018-07-16
  • 1970-01-01
  • 2011-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-28
相关资源
最近更新 更多