【问题标题】:PHP, MySQL and Join with SUMsPHP、MySQL 和加入 SUM
【发布时间】:2015-04-26 06:51:28
【问题描述】:

长期聆听者,第一次来电者。希望我不要搞砸我的第一个问题!我正在开发一个报告生成应用程序,我刚刚遇到了我需要一个相当复杂的查询的第一种情况。

表 1 称为“performance”,包含“merchant_id”、“publisher”、“sales”、“orders”和“report_date”列。

表 2 称为“publishers”,包含“publisher_id”、“publisher”、“status”、“location”等列。

我需要在报告中填写按销售额排序的前十名表现者。我需要他们的姓名 (publisher)、他们的 ID (publisher_id)、他们的销售总额 (sales)、订单总额 (orders) 以及指定时间段 (report_date) 和特定商家 (merchant_id) 内的所有这些内容。

我对 JOIN 完全陌生。这是我迄今为止尝试过的:

$sql = "SELECT
        performance.publisher,
        publishers.publisher_id,
        SUM(performance.orders) AS orders,
        SUM(performance.sales) AS sales
        FROM performance
        INNER JOIN publishers
        ON performance.publisher=publishers.publisher
        WHERE performance.merchant_id='$merchant->ID'
        AND (performance.report_date BETWEEN '{$dateStart}' AND '{$dateEnd}')
        GROUP BY publishers.publisher_id
        ORDER BY sales DESC LIMIT 10";

然后我运行查询并创建一个结果数组。

而且返回的确实是十个结果!发布者和发布者 ID 正确返回。是金额搞砸了。我试过弄乱开始日期和结束日期,但无济于事。我只是看不到返回的数字来自哪里。

我应该如何构造查询?

希望这个问题不是太具体或太狭窄 - 如果是这样,我很乐意尝试重写它以对更广泛的受众更有价值。

编辑:

我最初的总结中遗漏了一条重要信息。 publishers 表还有一个名为“merchant_id”的列,每个发布者都将基于每个merchant_id 输入到该表中。例如,出版商 John Doe,publisher_id 123,merchant_id 12345 和出版商 John Doe,publisher_id 123,merchant_id 56789。

当我进行连接时,我希望获得仅与特定商家 ID 相关的结果,正如您在 WHERE 子句中看到的那样。但是那个 WHERE 子句只考虑了性能表的商家 ID。它还需要考虑发布者表中的merchant_id。现在我只需要弄清楚它的查询结构。

我是 StackOverflow 的新手,所以感谢大家的耐心和提供问题和建议。我不知道这样的编辑是否合适,或者我是否应该为问题创建一个答案或什么。

【问题讨论】:

  • 你能用一些测试数据做一个 sql fiddle 吗?
  • 差点忘了:$merchant->ID 和 $dateStart 和 $dateEnd 变量是在执行查询之前设置的(当然)并且设置正确。他们没有促成这个问题。这是我检查的第一件事。
  • 看起来不错,正如@Naruto 所说,带有数据的 SQl Fiddle 会有所帮助。我注意到的一件事是您正在 SUMming order,如果 order 是一个 ID,您可能希望使用 COUNT() 代替(即订单计数而不是订单总和值)。
  • @DanielM.Clark 我明白了吗? performance.publisher 持有出版商的头衔?不是publisher_id?
  • 您能在此处发布原始数据样本吗?结果你有?和预期的结果??

标签: php mysql join sum


【解决方案1】:

三件事:

  1. 确保您知道SUM()COUNT() 之间的区别。看来您可能在订单中使用了SUM(),而您需要的是COUNT()
  2. 您正在滥用对 GROUP BY 的有害 MySQL 扩展。阅读此内容:http://dev.mysql.com/doc/refman/5.6/en/group-by-handling.html 尝试使用 GROUP BY performance.publisher, publishers.publisher_id 代替您所拥有的。
  3. 请注意,JOIN 操作本质上会导致结果集中的行组合爆炸。与您的 ON 条件匹配的每一对行都将显示在结果中。这可能会导致结果中出现双重或多重计数。不清楚你是否重复计算。但请注意。

【讨论】:

  • 1.是的,我对 SUM 没意见。它们使用得当。绩效表的每一行都是一天的订单量(一个数字)和销售额(一个美元金额)。目标是总结两个日期之间的所有订单和销售额。 2. 我试过了,结果没有变化,但我会阅读更多关于 GROUP BY 的信息,谢谢。 3. 现在我们开始做点什么了。销售额和订单均下降了预期值的 8 倍。显然,它们被多次求和 - 正好是 8 次!这就是我现在重点调查的地方,谢谢!!
  • publishers表中publisher_idpublisher是什么关系?为什么要加入publisher 上的performance 表?您是否有可能有多个 publisher_id 值具有相同的 publisher 值。我闻起来像。
  • 不幸的是,我实际上对表格的结构几乎没有发言权。在 publishers 表中,每个发布者(一个人)都有一个名称和一个 ID 号(publisher 和 publisher_id)。我还是个新手,所以当你问我为什么加入出版商的表现时,我想这是因为我读了一个类似的例子,并认为这是要走的路。不过,我发现了问题所在,即发布者在发布者表中的每个商家 ID 都列出了一次。数字减少 8 次是因为发布者的名称在发布者表中列出了 8 次 - 每个商家 ID 一个。
  • 啊。我认为类似的事情是你的组合爆炸的根本原因。你想好要做什么了吗?
  • 我没有,没有。我想首先在 WHERE 子句之后简单地添加另一个 AND - WHERE performance.merchant_id='$merchant->ID' AND publishers.merchant_id='$merchant->ID' - 但这不起作用(我想我明白为什么)。我也调查了 DISTINCT,但没有任何结果。我还在追捕!
猜你喜欢
  • 2015-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2013-07-25
  • 1970-01-01
相关资源
最近更新 更多