2014-01-30 6 views
2

У меня есть 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 

Я запутался, как сделать запрос, но, вероятно, будет что-то вроде:

SELECT, ID, FILE, START_DATE, END_DATE, NO_PAYMTS ИЗ file_payments ГДЕ()

Очевидно, что это не работает, потому что нет критериев в предложении WHERE, чтобы присоединиться к таблицам, как я могу заставить его работать?

+0

«Итак, я думаю о подсчете записей на второй таблице, которые находятся между START_DATE и END_DATE с первого». Итак, есть ваши критерии! – Strawberry

ответ

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 | 
+0

О, это был простой человек, спасибо! –

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; 
1

Попробуйте это ... Она работает на моей стороне :) Я взял t он свободен считать только ID из таблицы 2, так как теоретически он должен быть быстрее по сравнению с использованием *.

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; 
Смежные вопросы