【问题标题】:mysql select join second rowmysql 选择加入第二行
【发布时间】:2020-03-21 13:10:33
【问题描述】:

任务

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

【问题讨论】:

  • 试试这个,让我知道这是否有效。 select task.task_id, task.content, task_child.type, task_child.task_date from task, task_child where task.task_id=task_child.task_id and task_child.id=2
  • @twister,如果你不想使用id = 2,你可以尝试使用row_number,然后在你的where条件中使用它
  • 怎么样?有什么例子吗?

标签: mysql sql join select


【解决方案1】:

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

select t.task_id, t.content, c.type, c.date_task
from task t
inner join (
    select 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

select 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】:

    如果你想要第二个状态,你可以使用相关子查询:

    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) 上建立索引。

    【讨论】:

      【解决方案3】:

      这应该会有所帮助:

         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;
      

      希望对你有所帮助。

      【讨论】:

        猜你喜欢
        • 2011-03-17
        • 1970-01-01
        • 2021-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-13
        相关资源
        最近更新 更多