[英]Select between two dates from other table
我有一个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中选择SELECT ID,FILE,START_DATE,END_DATE,NO_PAYMTS()
显然,这是行不通的,因为WHERE子句中没有任何标准可以联接表,我该如何使其起作用?
查询:
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 |
查询:
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中的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;
最好的方法是使用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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.