重用子查询中的联接表

yyyllmsg  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(382)

有什么方法可以重用我们在子查询中联接的表的引用吗?
我有三张table:
任务类别,有关任务类别的信息
任务优先级,与任务类别关联的优先级
任务链接,每个任务的url链接。
请检查这把小提琴。

CREATE TABLE task_categories (
    task_category_id int,
    code varchar(255),
    name varchar(255)
);

CREATE TABLE task_priorities (
    priority_id int,
    task_category_id int,
    priority int
);

CREATE TABLE task_links (
    task_links_id int,
    task_category_id int,
    title varchar(255),
    link varchar(255),
    position int
);

如果我们需要具有高优先级的任务链接,我们需要连接所有这些表。像这样的

select * from task_links t_links
inner join task t on t_links.task_id = t.task_id
inner join task_priorities t_priorities on t.task_id = t_priorities.task_id
where t.code in ('TASK_P2', 'TASK_P3') and
t_priorities.priority = (select min(priority) from task_priorities tp 
                         inner join task t on tp.task_id = t.task_id 
                         where t.code in('TASK_P2', 'TASK_P3'))
order by t_links.position;

有没有办法优化这个查询?这个查询连接了表两次,我认为应该有更好的方法来编写这个查询。

t8e9dugd

t8e9dugd1#

子查询的逻辑不正确。它不是为每个任务选择最低优先级。
我猜你真的想要:

where t.code in ('TASK_P2', 'TASK_P3') and
      tp.priority = (select min(tp2.priority)
                     from task_priorities tp2
                     where tp2.task_id = t.task_id 
                    )

这不需要比上的索引更多的优化 task_priorities(task_id, priority) .

相关问题