任务
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
答案 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)
上建立索引。