2009-04-30 113 views
0

如何優化此查詢?看起來應該有一個更簡單的方法來做到這一點。目標是它仍然能夠很容易地變成刪除聲明。如何優化此查詢?

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

你能解釋一些關於數據和查詢應該做什麼/返回的內容嗎? – 2009-04-30 20:23:33

+1

而你如何格式化該代碼更好一點... – 2009-04-30 20:24:26

回答

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 

它看起來就像你試圖發現在一個事件,但都沒有在註冊表中的所有球隊。這是否準確?

另外,我想說明的是,加入一些子查詢會更快,特別是如果子查詢依賴於每一行(在你的情況下,他們這樣做)。

乾杯,
埃裏克

0

談到埃裏克在這個線程查詢,我會建議(從我MSSQLSERVER背景)使用一個存在檢查來代替。這樣做(1)使您的意圖更加清晰,並且(2)使優化程序有機會在找到第一個匹配的team_id後停止檢查匹配的team_id(因爲> = 1的匹配行導致存在檢查爲錯誤)。 例如

從 T隊選擇 噸。* 內的加盟計劃小號t.schedule_id = s.schedule_id 內部聯接事件e上s.event_id = e.event_id 其中 e.event_id = 183 和不存在(select * from註冊其中team_id = t.team_id)

但也許有mysql特定的性能問題。