我可以使用事务来确保在停止查询后我的查询结果正是我想要的吗?

时间:2016-07-02 02:17:29

标签: mysql sql transactions

所以,我有一个选择查询,它应该返回购买超过3次的客户。例如,如果客户A有4次购买,我的查询结果应包括此客户及其交易(4次购买时为4行)。但是有2次购买的顾客B,不应该包括在结果中,也不应该包括他的2次交易。我的查询需要太长时间,我需要在运行过程中停止查询(终止它)。但是,我希望查询的结果具有要求(即3购买限制)。换句话说,我希望那些客户将他们的交易插入到结果中,但是由于暂停,交易数量还不是3,要从结果中删除以维持需求。我正在考虑使用交易。但我不知道怎么能这样做。这个例子展示了我想要的东西。想象一下这是我原来的表:

customer_id   purchase_price
  1            200
  1            300
  1            230
  1            340
  2            55
  2            56
  3            566
  3            45
  3            666

如果我的查询在没有中断的情况下终止,那么我想要的结果应该是这样的:

     customer_id   purchase_price
  1            200
  1            300
  1            230
  1            340
  3            566
  3            45
  3            666

但不是这样:

   customer_id   purchase_price
  1            200
  1            300
  1            230
  1            340
  3            566
  3            45

换句话说,如果程序在终止之前停止(程序在为客户3插入每个事务之前停止),我应该得到这样的结果:

  customer_id   purchase_price
  1            200
  1            300
  1            230
  1            340

1 个答案:

答案 0 :(得分:0)

大多数数据库都支持ANSI标准窗口函数。您可以直接使用它们进行操作:

select t.*
from (select t.*, count(*) over (partition by customer) as cnt
      from transactions t
     ) t
where cnt >= 20;

MySQL不支持这些功能。相反,你可以这样做:

select t.*
from transactions t join
     (select customer, count(*) 
      from transactions
      group by customer
      having count(*) >= 20
     ) tc
     on tc.customer = t.customer;