如何优化此查询?似乎应该有一个更容易的方法来做到这一点。目标是它仍然可以很容易地变成删除声明。
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
)
答案 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的问题。