长时间的倾听者,第一次打电话的人。希望我不要搞砸我的第一个问题!我正在开发一个报表生成应用程序,刚遇到第一个需要相当复杂查询的情况。
表1称为“性能”,包含“商家ID”、“发布者”、“销售”、“订单”和“报告日期”列。
表2称为“publishers”,包含列“publisher\u id”、“publisher”、“status”、“location”和其他一些列。
我需要在报告中列出按销售额排序的前十名。我需要他们的名字(出版商),他们的ID(出版商ID),他们的销售总额(销售额),订单总额(订单)和所有这些东西在指定的时间段内(报告日期)和一个特定的商人(商人ID)。
我是新加入的。这是我迄今为止所做的尝试:
$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”的列,每个publishers都将以每个merchant_id为基础输入此表。例如,publisher john doe、publisher_id 123、merchant_id 12345和publisher john doe、publisher_id 123、merchant_id 56789。
当我加入的时候,我希望得到的结果只与一个特定的商人id相关,你可以从where子句中看到。但where子句只考虑了性能表的商人id。它还需要考虑出版商表中的商家id。现在我只需要找出查询结构。
我是新来的StackOverflow,所以感谢大家的耐心和提出问题和建议。我不知道这样的编辑是否是正确的,或者我是否应该创建一个问题的答案或什么。
最佳答案
三件事:
确保您知道SUM()
和COUNT()
之间的区别。似乎您可能在您的订单上使用了SUM()
,而COUNT()
正是您所需要的。
您误用了有害的mysql扩展来GROUP BY
。读这个:http://dev.mysql.com/doc/refman/5.6/en/group-by-handling.html试着用GROUP BY performance.publisher, publishers.publisher_id
代替你现有的。
注意,join操作的性质会导致结果集中行的组合爆炸。与ON
条件匹配的每对行都将显示在结果中。这可能会导致你的结果重复或多次计数。不清楚你是否在重复计算。但要注意。