如何优化此查询?似乎应该有一个更容易的方法来做到这一点。目标是它仍然可以很容易地变成删除声明。

SELECT * FROM team 
WHERE team_id IN (
                  SELECT team_id 
                  FROM (
                        SELECT team.team_id, (
                                              SELECT COUNT(*) 
                                              FROM signup 
                                              WHERE signup.team_id = team.team_id
                                             ) AS members 
                        FROM team, schedule, event 
                        WHERE team.schedule_id = schedule.schedule_id 
                        AND schedule.event_id = event.event_id
                        AND event.event_id =183) AS t 
                  WHERE members = 0
                 )
有帮助吗?

解决方案

快速浏览一下这个问题就可以了:

select
    t.*
from
    team t
    inner join schedule s on t.schedule_id = s.schedule_id
    inner join event e on s.event_id = e.event_id
    left outer join signup sp on t.team_id = sp.team_id
where
    e.event_id = 183
    and sp.team_id is null

看起来您正在尝试查找所有参加活动但不在注册表中的球队。这准确吗?

另外,我想要注意,连接和一堆子查询会更快,特别是如果子查询依赖于每一行(在你的情况下,它们都是这样)。

干杯,结果 埃里克

其他提示

在这个帖子中评论Eric的查询,我建议(从我的mssqlserver背景)使用存在性检查。这样做(1)使您的意图更加清晰,并且(2)使优化器有机会在找到第一个之后停止检查匹配的team_id(因为> = 1匹配行导致存在性检查为假)。 E.g。

选择     吨。* 从     队伍     内联接计划在t.schedule_id = s.schedule_id上     s.event_id = e.event_id上的内连接事件e 哪里     e.event_id = 183     并且不存在(选择*来自注册,其中team_id = t.team_id)

但也许有特定于mysql的问题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top