Mysql 仅从具有where条件的联接表中选择第一条记录
我已经用PHP解决了这个问题,但我知道如果我能为它做一个查询,它会更快。我有以下两张桌子Mysql 仅从具有where条件的联接表中选择第一条记录,mysql,sql,codeigniter,Mysql,Sql,Codeigniter,我已经用PHP解决了这个问题,但我知道如果我能为它做一个查询,它会更快。我有以下两张桌子 projects: +------------+--------------+ | project_id | project_name | +------------+--------------+ | 1 | a | | 2 | b | | 3 | c | | 4
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有两个任务,但最早的任务提前一天完成
非常感谢您的帮助。您可以尝试以下方法:-
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
您可以尝试在状态为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
您如何获得2015-01-01 12:00:00记录而不是2015-01-02 12:00:00记录?您必须使用MAX运算符获取最近的任务,然后加入以将任务与项目合并。使用WHERE选择状态1或2MINT.task_id、MINT.task_status、MINT.task_due_timestamp可以选择不在同一行的3个字段。已接受。我没有仔细阅读这些问题。我已经编辑了我的回答您是否测试了此查询?这将创建一组单行,因此从同一项目返回多个任务。