2015-07-20 105 views
1

我已經使用PHP解決了這個問題,但是我知道如果我可以爲它做一個查詢,速度會更快。我有以下2個表格。僅從連接表中選擇第一條記錄,其中條件爲

projects:  
+------------+--------------+ 
| project_id | project_name | 
+------------+--------------+ 
| 1   | a   | 
| 2   | b   | 
| 3   | c   | 
| 4   | d   | 
+------------+--------------+ 

tasks: 
+------------+------------+-------------+---------------------+ 
| project_id | task_id | task_status | task_due_timestamp | 
+------------+------------+-------------+---------------------+ 
|  1  |  1  |  1  | 2015-01-01 12:00:00 | 
|  1  |  2  |  2  | 2015-01-02 12:00:00 | 
|  2  |  3  |  3  | 2015-01-03 12:00:00 | 
|  3  |  4  |  1  | 2015-01-04 12:00:00 | 
+------------+------------+-------------+---------------------+ 

我需要一個查詢,將選擇與具有1或2狀態的情況下選擇任務必須是最近的一個及其相關的任務中的所有項目。見下表。

records after query: 
+------------+--------------+------------+-------------+---------------------+ 
| project_id | project_name | task_id | task_status | task_due_timestamp | 
+------------+--------------+------------+-------------+---------------------+ 
|  1  | a   |  1  |  1  | 2015-01-01 12:00:00 | 
|  2  | b   |  null | null  |  null   | 
|  3  | c   |  3  |  3  | 2015-01-01 12:00:00 | 
|  4  | d   |  null |  null | null    | 
+------------+--------------+------------+-------------+---------------------+ 

正如你所看到的,項目2不應該有任務,因爲任務狀態是2.而項目4沒有項目。項目1有2個任務,但最早的一個是早一天。

任何幫助將不勝感激。

+0

你如何讓2015年1月1日12:00:00的記錄,而不是2015年1月2日12:00:00? – HaveNoDisplayName

+0

您必須使用MAX運算符獲取最近的任務,然後使用JOIN將任務與項目合併。使用WHERE選擇狀態1 OR 2 – Darkwing

回答

-3

你可以試試這個: -

SELECT P.project_id, P.project_name, T.task_id, T.task_status, MIN(T.task_due_timestamp) 
FROM projects P INNER JOIN tasks T 
ON P.project_id = T.project_id 
AND T.task_status IN (1,2) 
GROUP BY P.project_id, P.project_name, T.task_id, T.task_status 
+0

'MIN(T.task_id),MIN(T.task_status),MIN(T.task_due_timestamp)'可以選擇不在同一行的3個字段。 – Shoe

+0

接受。我沒有徹底讀懂這些問題。我已編輯我的回答 –

+0

你測試了這個查詢嗎? – HaveNoDisplayName

0

您可以用左嘗試加入的最新任務,狀態12。查詢想是這樣的:

select p.*, t.* 
from projects as p 
    left join (
    select t1.* 
    from tasks as t1 
    where t1.task_status in (1, 2) 
     and not exists (
     select task_id from tasks as t2 
     where t1.task_id <> t2.task_id 
      and t1.project_id = t2.project_id 
      and t2.task_status in (1, 2) 
      and t2.task_due_timestamp > t1.task_due_timestamp 
    ) 
) as t on p.project_id = t.project_id 

Live demo

相關問題