从其他表中选择两个日期

时间:2014-01-30 11:59:58

标签: mysql sql

我有一个mysql表(file_payments)来保存文件中包含的付款记录,看起来像这样

ID  FILE   START_DATE   END_DATE    NO_PAYMTS
--  -----  ----------   ----------  ---------
1   file1  2013-10-11   2013-10-15     6
2   file2  2013-10-16   2013-10-20     10

然后我有另一张表(付款),其中包含有关此付款的更多详细信息

   ID   DATE        AMOUNT       BANK   
   ---  ----------  ----------   ----  
    1   2013-10-11  100.00        3
    2   2013-10-12  500.00        3
    3   2013-10-13  400.00        2
    4   2013-10-15  200.00        2 
    5   2013-10-16  400.00        4  
    6   2013-10-18  300.00        1 
    7   2013-10-19  700.00        3 

我需要关联两个表来验证第一个表中的 NO_PAYMTS 是否与第二个表中的实际付款数量相对应,所以我正在考虑计算第二个表中的记录介于第一个 START_DATE END_DATE 之间。此示例中预期的输出是:

START_DATE   END_DATE    NO_PAYMTS   ACTUAL_PAYMTS
----------   ----------  ---------   -------------
2013-10-11   2013-10-15     6             4
2013-10-16   2013-10-20     10            3

我很困惑如何进行查询,但可能会像:

从file_payments中选择ID ID,FILE,START_DATE,END_DATE,NO_PAYMTS WHERE()

显然这不起作用,因为在WHERE子句中没有加入表的条件,我该如何使它工作?

4 个答案:

答案 0 :(得分:4)

查询:

<强> SQLFIDDLEExample

SELECT t1.ID,
       t1.FILE,
       t1.START_DATE,
       t1.END_DATE,
       t1.NO_PAYMTS,
       (SELECT COUNT(*)
        FROM Table2 t2
        WHERE t2.DATE >= t1.START_DATE
        AND t2.DATE <= t1.END_DATE ) AS ACTUAL_PAYMTS
FROM Table1 t1

结果:

| ID |  FILE | START_DATE |   END_DATE | NO_PAYMTS | ACTUAL_PAYMTS |
|----|-------|------------|------------|-----------|---------------|
|  1 | file1 | 2013-10-11 | 2013-10-15 |         6 |             4 |
|  2 | file2 | 2013-10-16 | 2013-10-20 |        10 |             3 |

答案 1 :(得分:1)

查询:

SELECT f.id, f.file, f.start_date, f.end_date, f.no_paymnts, COUNT(p.bank) 
from file_payments f, payments p
WHERE p.date BETWEEN f.start_date AND f.end_date
GROUP BY f.id;

JSFiddle:http://sqlfiddle.com/#!2/8446f/13

答案 2 :(得分:1)

尝试这个......它适用于我这边:)我冒昧地只计算表2中的ID,因为理论上它与使用*相比应该更快。

SELECT T1.ID,
       T1.FILE,
       T1.START_DATE,
       T1.END_DATE,
       T1.NO_PAYMTS,
       (SELECT COUNT(T2.ID) FROM TABLE2 T2 WHERE T2.DATE>=T1.START_DATE AND T2.DATE<=T1.END_DATE) as ACTUAL_PAYMTS
FROM TABLE1 T1;

答案 3 :(得分:0)

执行此操作的最佳方法是使用SQL函数。创建如下所示的函数,然后使用您的查询执行它。

功能:

DELIMITER $$
DROP FUNCTION IF EXISTS `getPaymentCount`$$

CREATE  FUNCTION `getPaymentCount`(startDate DATE,endDate DATE) RETURNS INT(10)
BEGIN
    DECLARE paymentCount INT(10);
    SELECT  COUNT(*) INTO paymentCount FROM payments WHERE  DATE  BETWEEN startDate AND endDate;
    RETURN paymentCount;
END$$

DELIMITER ;

查询:

SELECT ID,FILE,START_DATE,END_DATE,NO_PAYMTS,getPaymentCount(start_date,end_date) AS ACTUAL_NO_OF_PAYMENTS FROM file_payments;