2015-09-19 23 views
0

我想要連接4個表以列出表中所有具有從上次更新到當前日期的持續時間的值,而不是其他表中的持續時間,表中給出如下(我的英語不是很好理解這樣正與examble解釋)如何從CURDATE()前n天從MySQL獲得值()

第一臺daily_tasks

+---------+---------+ 
| task_id | type_id | 
+---------+---------+ 
|  1 |  1 | 
|  2 |  1 | 
|  3 |  2 | 
+---------+---------+ 

二表daily_task_report

+-----------+---------+------------+ 
| report_id | task_id | task_date | 
+-----------+---------+------------+ 
|   1 |  1 | 2015-09-10 | 
|   2 |  3 | 2015-09-10 | 
|   3 |  1 | 2015-09-11 | 
|   4 |  3 | 2015-09-16 | 
+-----------+---------+------------+ 

三表duration_types

+---------+---------------+------------------------+ 
| type_id | duration_type | duration_time(in days) | 
+---------+---------------+------------------------+ 
|  1 | Daily Task |      1 | 
|  2 | Weekly Task |      6 | 
|  3 | Monthly Task |      26 | 
|  4 | Yearly Task |     313 | 
+---------+---------------+------------------------+ 

四表calendar

+--------+------------+---------+ 
| cal_id | cal_date | holiday | 
+--------+------------+---------+ 
|  1 | 2015-09-10 |  0 | 
|  2 | 2015-09-11 |  0 | 
|  3 | 2015-09-12 |  0 | 
|  4 | 2015-09-13 |  1 | 
+--------+------------+---------+ 

這裏daily_tasks.type_idduration_types.type_iddaily_task_report.task_iddaily_tasks.task_id。我想選擇所有task_id那些task_datecurrent_date之間的差異將大於duration_time,同時計算我必須避免從有holiday=1的日期的持續時間。 我試過查詢,但不正確,我得到的值不包括calendar表,但這不是一個好方法,查詢需要更多時間來執行。

"SELECT dailyTasks.task_id FROM 
          (SELECT tab.* FROM (SELECT 
          tasks.task_type,report.* 
          FROM daily_tasks AS tasks 
          LEFT JOIN daily_task_reports AS report ON tasks.task_id=report.task_id 
          WHERE 1 ORDER BY report.task_date DESC) as tab GROUP BY tab.d_task_id) AS dailyTasks 
          LEFT JOIN duration_types AS type ON dailyTasks.task_type=type.type_id 
          WHERE DATEDIFF(CURDATE(),dailyTasks.task_date)>=type.duration_time" 

請人幫忙,我堅持在本節

回答

0

根據給定的表您的查詢

一些意想不到的文字或未知列嘗試此查詢

"SELECT dailyTasks.d_task_id FROM 
         (SELECT tab.* FROM 
           (SELECT tasks.type_id,report.* FROM daily_tasks AS tasks 

            LEFT JOIN daily_task_reports AS report ON tasks.task_id=report.task_id 

            ORDER BY report.task_date DESC) 

           as tab GROUP BY tab.task_id) AS dailyTasks 

           LEFT JOIN duration_types AS type ON dailyTasks.type_id=type.type_id 

         WHERE DATEDIFF(CURDATE(),dailyTasks.task_date)>=type.duration_time" 

它可以是一個LSO工作在單一的查詢

SELECT tasks.task_id FROM daily_tasks AS tasks 

     LEFT JOIN daily_task_reports AS report ON tasks.task_id=report.task_id 
     LEFT JOIN duration_types AS type ON tasks.type_id = type.type_id and DATEDIFF(CURDATE(),report.task_date) >= type.duration_time 

*我試過,但不排除id,這將有假期日曆 您可以在編碼端創建我給你包含新的查詢與日曆 *

SELECT tasks.task_id,report.task_date,calendar.holiday FROM daily_tasks AS tasks 

     LEFT JOIN daily_task_reports AS report ON tasks.task_id=report.task_id 
     LEFT JOIN duration_types AS type ON tasks.type_id = type.type_id and DATEDIFF(CURDATE(),report.task_date) >= type.duration_time 
     LEFT JOIN calendar ON report.task_date=calendar.cal_date 
     where calendar.holiday = '0' 
     order By report.task_date desc 
+0

謝謝你的回答,但這不是我想要的方式,我認爲這是因爲三選擇查詢需要更多的執行時間,我還想包括日曆,排除節假日 –

+0

@BasilPJoy更新我的答案你的給定的查詢也可以與單個s一起工作elect語句 –

+0

這將工作,它會列出所有的任務,我只想要最後更新的任務,我也必須排除日曆中的日期那些有假期,Ajeeth,我給我的查詢只是爲了解釋我在嘗試 –