限制两列减和的总和等于一行的行

时间:2016-08-21 19:00:41

标签: php mysql

我正在使用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  

我想让我的批处理脚本处理“WAITING”标记的记录,直到达到两列总和(TOTAL_PAGES - PROCESSED_PAGES)等于100的点为止。

我实现这个的方法是查询:

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

然后在PHP脚本中我创建一个循环并减去行直到计数器达到100.但是通过组合SQL和PHP来使用这个方法并不是一个好主意。如何将此功能仅作为单个SQL查询实现?

更新

想象一下每次执行20页(整行,没有每一行),第一行和第三行不匹配条件,因此我们将处理第二,第四和第五行。从第二行开始,我们有14页(32 - 18)。因为第2行的剩余页面小于20,所以应该寻找下一页。下一个(#4)有40页,所以剩余页面的总和(14 + 40)大于20.所以它必须在这里停止并返回行(#2和#4)。

1 个答案:

答案 0 :(得分: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
    )

希望这有帮助!