2016-08-21 50 views
0

我正在处理PHP中的一些文件并使用MySQL来存储结果。这里是我的表看起来像:限制行减去两列之和等于一个值

tblConverts

ID ACCESS_KEY STATUS  TOTAL_PAGES PROCESSED_PAGES 
---- ------------ ----------- ------------- ----------------- 
    1 upYP5RbNqQ COMPLETED   10    10 
    2 IeH02qBAtV WAITING    32    18 
    3 Di5sCWxA2p REJECTED    28     0 
    4 Aft54Xhr3f WAITING    40     0 
    5 TzU1VMoeQF WAITING    30     0 

我要让我的批处理脚本在“等待”标记的记录工作,直到它到达一个点,两列(TOTAL_PAGES的总和 - 例如PROCESSED_PAGES)等于100。

我实现这一点的方法是查询:

SELECT * FROM tblConverts WHERE status = 'WAITING' AND TOTAL_PAGES > PROCESSED_PAGES LIMIT 500

然后在PHP脚本我做一个循环,直到计数器达到100,但使用这种方法结合SQL和PHP是减去行不是一个好主意。我怎样才能实现这个功能只有一个SQL查询?

UPDATE

试想每执行20页(整行,没有每一行),第一和第三行是不匹配的条件,所以我们会在第二,第四和第五行工作。从第二行开始,我们有14页(32 - 18)。由于第2行的剩余页面少于20个,它应该查找下一个页面。下一个(#4)有40个页面,所以剩余页面总数(14 + 40)大于20.因此它必须停在这里并返回行(#2和#4)。

+0

那么,你用'TOTAL_PAGES> PROCESSED_PAGES'写了第一个查询。你知道你想要什么:'TOTAL PAGES - PROCESSED_PAGES = 100'(尽管实际上'> ='或'<='可能是更好的选择)。你如何_思考你的查询应该改变? – Chris

+0

@Chris我更新了我的问题,如果我无法解释,请告诉我。 – Bablod

回答

1

请试试这个,让我知道你是否也在寻找相同的东西。

注意:20是限制,因为你在你的问题中提到。您可以根据您的要求更改它。

SELECT 
    * 
FROM 
    tblConverts 
WHERE 
    ID IN (
     SELECT 
      m1.ID 
     FROM 
      tblConverts m1 
     LEFT JOIN tblConverts m2 ON m1.ID >= m2.ID 
     WHERE 
      m1. STATUS = 'WAITING' 
     AND m2. STATUS = 'WAITING' 
     GROUP BY 
      m1.ID 
     HAVING 
      SUM(
       m2.TOTAL_PAGES - m2.PROCESSED_PAGES 
      ) - SUM(m1.TOTAL_PAGES)/COUNT(m1.TOTAL_PAGES) < 20 
    ) 

希望这有助于!

+0

非常感谢,这就是我想要的。只是一个问题,我不明白复杂的SQL查询,为什么你已经检查了m1.status和m2.status? m1.id在这里意味着什么?我们是否将m1指向第一个SELECT的结果? – Bablod

+0

对不起,延迟回复。这个查询的基本登录信息在'id'列加上'> =',这样我就必须为这两个别名设置'status'条件'waiting'。我为同一个表创建了两个别名(就像我们在自联接中那样),所以m1.id是别名m1表的列。我在m1表上实现了group by,因此在select语句中必须有m1.id。 – chirag