MySQL选择加入第二行

时间:2019-11-26 07:05:04

标签: mysql sql join select

任务

task_id |  content | date
-------------------------------
1       | task 1   | 2019-11-26
2       | task 2   | 2019-11-27

task_child

id | task_id | type | date_task
--------------------------------
1  | 1       | A    | 2019-11-26
2  | 1       | B    | 2019-11-27
3  | 1       | A    | 2019-11-28
4  | 1       | B    | 2019-11-28
5  | 2       | A    | 2019-11-26
6  | 2       | B    | 2019-11-26
7  | 2       | C    | 2019-11-28

嗨,我有两个以上的表,如何联接该表以便仅从每个task_child中获得第二行?

结果应如下所示:

task_id | content | type | date_task
------------------------------------
1       | task 1  | B    | 2019-11-27
2       | task 2  | B    | 2019-11-26

3 个答案:

答案 0 :(得分:0)

这应该有帮助:

   SELECT 
       Task.task_id, 
       Task.content, 
       Task_Child.type,
       Task.task_date
    FROM 
       Task
    INNER JOIN 
       Task_Child 
    ON 
       Task.task_id=Task_Child.task_id;

希望这对您有所帮助。

答案 1 :(得分:0)

如果运行的是MySQL 8.0,则可以在子查询中使用row_number()对具有相同task_id的组中子表中的记录进行排名,并将其用作联接过滤器:

selelct t.task_id, t.content, c.type, c.date_task
from task t
inner join (
    selct c.*, row_number() over(partition by task_id order by date_task) rn
    from task_child
) c on c.task_id = t.task_id and c.rn = 2

在早期版本中,这有点复杂。一种解决方案是添加带有子查询的联接条件,以确保子表中只有一条记录与当前联接的记录具有相同的task_id和更早的date_task

selelct t.task_id, t.content, c.type, c.date_task
from task t
inner join task_child c 
    on c.task_id = t.task_id 
    and (
        select count(*) 
        from task_child c1 
        where c1.task_id = c.task_id and c1.date_task < c.date_task
    ) = 1

答案 2 :(得分:0)

如果您想要第二种状态,则可以使用相关的子查询:

select t.*,
       (select tc.type
        from task_child tc
        where tc.task_id = t.task_id
        order by tc.id
        limit 1, 1
       ) as type
from task t;

鉴于您只需要一栏,这可能是最有效的方法,无论MySQL版本如何。为了获得最佳性能,您需要在task_child(task_id, id, type)上建立索引。