2015-07-20 75 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

相关问题