Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 仅从具有where条件的联接表中选择第一条记录_Mysql_Sql_Codeigniter - Fatal编程技术网

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

Mysql 仅从具有where条件的联接表中选择第一条记录,mysql,sql,codeigniter,Mysql,Sql,Codeigniter,我已经用PHP解决了这个问题,但我知道如果我能为它做一个查询,它会更快。我有以下两张桌子 projects: +------------+--------------+ | project_id | project_name | +------------+--------------+ | 1 | a | | 2 | b | | 3 | c | | 4

我已经用PHP解决了这个问题,但我知道如果我能为它做一个查询,它会更快。我有以下两张桌子

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个字段。已接受。我没有仔细阅读这些问题。我已经编辑了我的回答您是否测试了此查询?这将创建一组单行,因此从同一项目返回多个任务。