【发布时间】: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”的情况下进行测试,以提醒自己问题所在。