我有一个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子句中没有加入表的条件,我该如何使它工作?
答案 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;