如何优化此查询?

时间:2009-04-30 20:19:08

标签: sql mysql database select join

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

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
                 )

2 个答案:

答案 0 :(得分:3)

快速浏览一下这个查询就可以了:

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

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

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

干杯,
埃里克

答案 1 :(得分:0)

在这个帖子中评论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的问题。