Mysql 从其他表中选择两个日期
我有一个mysql表文件,用于保存文件中包含的付款记录,如下所示Mysql 从其他表中选择两个日期,mysql,sql,Mysql,Sql,我有一个mysql表文件,用于保存文件中包含的付款记录,如下所示 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
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 NO_PAYMTS ACTUAL_PAYMTS
---------- ---------- --------- -------------
2013-10-11 2013-10-15 6 4
2013-10-16 2013-10-20 10 3
我不知道如何进行查询,但可能是这样的:
从文件付款中选择ID、文件、开始日期、结束日期、无付款
在哪里
显然,这不起作用,因为WHERE子句中没有连接表的条件,如何使其工作?查询:
最好的方法是使用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;
查询:
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;
jsiddle:试试这个……它在我这方面很有效:我冒昧地只计算表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;
所以我在考虑从第一个表开始计算第二个表的开始日期和结束日期之间的记录。这就是你的标准!
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;
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;