繁体   English   中英

仅从具有where条件的联接表中选择第一条记录

[英]Selecting first record only from join table with a where condition

我已经使用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个任务,但最早的任务要早一天。

任何帮助将不胜感激。

您可以尝试左联接执行状态为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

现场演示

您可以尝试以下方法:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM