【问题标题】:MySQL help: How to find all orders from a customer till price <= 20 and status='unpaid'MySQL 帮助:如何查找客户的所有订单,直到价格 <= 20 且状态='未付'
【发布时间】:2012-03-22 13:58:07
【问题描述】:

我认为通过提供以下示例可以更好地理解我的问题:

我有一个包含以下数据的表格:

orderid  Price username paymentstatus
1        10    john     unpaid
2        10    john     unpaid
4        10    john     unpaid
5        10    john     unpaid
6        10    sam      unpaid
7        10    john     unpaid
8        10    john     paid

我想查找(用户名)john 的所有订单,其中 paymentstatus 为“未付款”且总价为

所以结果应该显示以下 2 行(订单总额为 20 美元,付款状态为未付款,用户名为 john)

EXPECTED RESULT:
==
orderid  Price username paymentstatus
1        10    john     unpaid  
2        10    john     unpaid

==  

希望你明白我的观点/问题?

请帮忙..谢谢!

【问题讨论】:

  • 总价
  • price total 不是 mysql 字段。我希望 mysql 计算列价格并在价格总和(计算结果)为 20 时停止显示结果。因此在上面的示例中它必须显示不超过 2 个结果。
  • 为什么不考虑添加另一列来计算所有订单的总价格。这样编写查询会更容易。你只需要打印总价(新列)小于 20 的所有记录

标签: mysql product orders


【解决方案1】:

也许是这个?

SELECT *
FROM order_table
WHERE username = 'john' 
AND paymentstatus = 'unpaid'
AND Price <= 20

但根据您的标准,我希望结果还包括订单 4、5 和 7。

【讨论】:

  • 不抱歉,这返回了所有价格小于或等于 20 的订单,但所有这些订单的总数远远超过 20。我希望 mysql 计算价格并在价格总计时停止显示结果是 20。
  • 那么你实际上需要在你的问题中说明这一点。
【解决方案2】:

几乎完全一样same question answered here。前提是您需要另一列作为相关客户的总和...

我创建了与您的结果完全相同的表格和模拟数据,并得出了您的确切结果...问题是 MySQL 以某种方式每行应用标准两次,并且不明白如何或为什么...我强烈怀疑它一个错误,但无法描述它。无论如何,我确实有一个修复程序,它强制将内部“PreQuery”作为基础,并使用 @SQLVars 从其中返回所有记录,然后从中应用 WHERE 子句...

select properSummed.*
   from 
      ( select
              o.orderid, 
              o.price, 
              @RunningTotal := @RunningTotal + o.price as UnpaidSoFar
           from
              orders o, 
              (select @RunningTotal := 0 ) sqlvars
           where o.ownerid = 1
             and o.paymentstatus = 'unpaid' ) properSummed
    where 
       properSummed.UnpaidSoFar <= 50

【讨论】:

  • 感谢您的建议。但是,该问题也由 be 发布,我仍在寻找答案。发布到该问题的答案不起作用,并且没有其他人回复这么长时间,所以我再次发布了这个问题,看看现在是否有人可以回答它。请帮忙。
  • @HaiderAbbas,是的,我知道这是您最初的问题,但我从未看到您对我的查询进行测试的响应...您有错误吗?它返回了什么?
  • 我已经在实际表格上再次运行了您对上一个问题的建议,以向您展示结果。我会将它们作为答案发布,以使文本以简单的格式可读。问题是 TotalSoFar 值不正确。例如:如果有价值 50 美元的订单并且我选择 TotalSoFar => 50 那么它只返回价值 25 美元的订单(价格的一半)并隐藏所有其余的。我还尝试将所需金额增加一倍,但随后它返回了价值 60.00 美元的订单。我将完全按照我运行的方式发布查询,并将下面的实际测试结果作为我的答案。请检查并帮助我。谢谢!
  • 非常感谢 DRapp,你太棒了。我已将答案标记为正确。它终于按预期工作了。您能否确认此查询可能会或可能不会在 mysql 服务器上增加任何额外负载或生成任何额外的日志文件?我希望这段代码可以用于重型/大型数据库。
  • @HaiderAbbas,我认为这不会导致任何额外的问题,因为您正在对每组单身人士进行非常有限的查询......在该组中,有多少人实际上是“未付的” .因此,内部查询几乎会立即获得结果,然后以此为基础“排除”超出限制的结果。
【解决方案3】:

这个呢:

select *
from `orders`
where paymentstatus='unpaid' and username='john'
having sum(price) <= 20

【讨论】:

  • 它列出了所有订单,而不仅仅是其中的 2 个,就像我们计算前 2 个订单的价格一样,总价格为 20.00 美元,但它列出了价值 75.00 美元的订单。
  • 根据您创建的表格,产品的总和不可能是 75 美元,因为所有字段的价格都是 10 美元。
  • 是的,您是对的,价格显示为 70 美元而不是 75 美元。打字错误。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 2022-07-01
  • 2013-02-16
  • 1970-01-01
相关资源
最近更新 更多