[英]JOIN 2 tables with where condition, but show first row from table2
[英]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个任务,但最早的任务要早一天。
任何帮助将不胜感激。
您可以尝试左联接执行状态为1
或2
最新任务。 该查询将如下所示:
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.