繁体   English   中英

需要产品清单和订单

[英]Need the list of products and orders

这是我的家庭作业:

与订购次数最多的 5 个产品一起订购超过一次的产品以及它们所包含的订单数。(最终结果中不包括订购最多的 5 个产品)

产品和订单在同一张表中。 订单明细包含订单明细 ID、订单 ID、产品 ID、数量。

我已经尝试了一切,但我在查询中的“与”语句中苦苦挣扎。

这是我尝试过的查询:

select 
  productid,
  count
  (
    (select productid from orderdetails)
     and
    (select productid from orderdetails order by quantity desc limit 5)
  ) as ORDERS
from orderdetails 
group by productid
order by ORDERS desc

您从订单详细信息中进行选择,聚合以获得每个产品的一个结果行并进行计数。 COUNT(*)计算行数是很常见的,但您也可以计算表达式,例如COUNT(mycolumn) ,您只计算那些非空的。 您正在计算一个表达式(因为它不是COUNT(*)而是您正在使用的COUNT(something else) )。 测试 null 和 count 的表达式是

(select productid from orderdetails)
  and 
(select productid from orderdetails order by quantity desc limit 5)

然而,这不是一个表达式,它导致一个值被计数(当它不为空时)或不(当它为空时)。 您正在从 orderdetails 表中选择所有产品 ID,并从 orderdetails 表中选择订购数量最多的所有五个产品 ID。 然后你应用AND就好像它们是两个布尔值一样,但它们不是,它们是数据集。 除了不恰当地使用AND是布尔值而不是数据集的运算符之外,您在这里错过了应该以相同顺序查找产品的要点,即以某种方式比较订单号。

总而言之:这是完全错误的。 很抱歉这么说。 然而,在我看来,这项任务并不容易,为了解决它,你应该慢慢地、一步一步地构建你的查询。

与 5 种订购最多的产品一起订购的产品不止一次

该死的; 这么短的一句话,但那是骗人的;-) 我们有很多事情要做......

首先,我们必须找到订购最多的 5 种产品。 这意味着总结所有销售额并找到前五名:

select productid
from orderdetails
group by productid
order by sum(quantity) desc
limit 5

(问题是:如果订购最多的六种产品,例如产品 A、B 和 C 的数量为 200,而产品 D、E 和 F 的数量为 100,那么我们将得到前三名加上两个前 4 到 6。在标准 SQL 中,我们会用 ties 子句解决这个问题,但 MySQL 的LIMIT没有这个功能。)

反正。 现在我们正在寻找与这五种产品一起订购的产品。 这是否意味着同时拥有所有五个? 可能不是。 我们更愿意寻找与前五名中至少有一个处于同一订单的产品。

with top_5_products as
     (query above)
   , orders_with_top_5 as
     (select orderid
      from orderdetails 
      where productid in (select productid from top_5_products)
     )
   , other_products_in_order as
     (select productid, orderid
      from orderdetails 
      where orderid in (select orderid from orders_with_top_5)
      and productid not in (select productid from top_5_products)

一旦我们到达那里,我们甚至必须找到“不止一次”订购前 5 种产品中的一些产品,我将其解释为至少出现在包含前 5 种产品的两个订单中。

with <all the above>
select productid
from other_products_in_order
group by productid
having count(*) > 1;

虽然我们已经计算了产品与前 5 种产品共享的订单数量,但我们仍然没有,因为我们应该显示产品包含的订单数量,我想这是指所有订单,而不仅仅是那些包含前 5 名产品。 这是另一个计数,例如我们可以在 select 子句中获得。 然后查询变为:

with <all the above>
select
  productid,
  (select count(*) from orderdetails od where od.productid = opio.productid)
from other_products_in_order opio
group by productid
having count(*) > 1;

看到您仍在为语法而苦苦挣扎,这对于家庭作业来说是相当多的。 我们甚至还没有解决前 5 个或更多的关系问题(分析函数派上用场)。

WITH子句从 MySQL 8 开始可用,有助于获得这样一个逐步构建的查询可读性。 旧的 MySQL 版本不支持这个。 如果使用旧版本,我建议您升级:-) 否则您可以直接使用子查询。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM