长时间听众,第一次来电。希望我不要搞砸我的第一个问题!我正在开发一个报告生成应用程序,而且我遇到了第一种需要相当复杂查询的情况。
表1被称为'表现'并包含以下列:" merchant_id',' publisher',' sales',' orders' orders'以及' report_date'。
表2被称为' publishers'并且包含以下列:“发布商列表”,“发布商”,“状态”,“地点”,以及其他一些列。
我需要在报告中列出按销售额排序的前十名表演者。我需要他们的名字(发布商),他们的ID(publisher_id),他们的销售总额(销售额),订单总数(订单)以及指定时间段内的所有内容(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";
然后我运行查询并创建结果数组。
返回的确实是十个结果!正确返回publisher和publisher_id。这是混乱的总和。我试过搞乱开始和结束日期,但没有用。我无法看到返回的数字来自哪里。
我应该如何构建查询?
希望这个问题不是太具体或狭隘 - 如果是这样的话,我很乐意尝试重写它,以便对更广泛的受众更有价值。
编辑:
我原来的总结中遗漏了一条重要的信息。 publishers表还有一个名为' merchant_id'并且每个发布商将基于每个merchant_id输入此表。例如,发布商John Doe,publisher_id 123,merchant_id 12345和发布商John Doe,publisher_id 123,merchant_id 56789。
当我进行加入时,我希望得到的结果只与特定的merchant_id相关,正如您可以通过WHERE子句看到的那样。但是WHERE子句只考虑了性能表的merchant_id。它还需要考虑发布者表中的merchant_id。现在我只需要弄清楚它的查询结构。
我是StackOverflow的新手,感谢大家耐心等待并提出问题和建议。我不知道这样的编辑是否是正确的事情,或者我是否应该创建问题的答案或者是什么。
答案 0 :(得分:0)
三件事:
SUM()
和COUNT()
之间的区别。您的订单似乎正在使用SUM()
,COUNT()
就是您所需要的。GROUP BY
。阅读本文:http://dev.mysql.com/doc/refman/5.6/en/group-by-handling.html尝试使用GROUP BY performance.publisher, publishers.publisher_id
代替您拥有的内容。ON
条件匹配的每对行都会显示在结果中。这可能会导致结果中出现双重或多重计数。目前还不清楚你是否重复计算。但要注意它。