【发布时间】: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? -
您能在此处发布原始数据样本吗?结果你有?和预期的结果??