2017-07-18 75 views
0

我有一個MySQL數據庫和SQL查詢與子查詢。MySQL左連接存在的子查詢返回比它應該更多的行

我100%確定表s_k_p只有一行,其中s_k_p.season_id = 2s_k_p.user_id = k_i.user_id

無論如何,問題是LEFT JOIN s_k_p AS skp2部分返回10行。如上所述,它應該只返回一行。

SELECT skp2.season_id AS invalid_status_id 
FROM comp_i 
    INNER JOIN k_i ON k_i.ilmo_id = comp_i.id 

    LEFT JOIN s_k_p 
    ON s_k_p.user_id = k_i.user_id 
     AND s_k_p.season_id = 4 

    LEFT JOIN s_k_p AS skp2 
    ON skp2.user_id = k_i.user_id 
     AND EXISTS (
     SELECT * 
      FROM s_k_p 
      WHERE s_k_p.season_id = 2 
      AND s_k_p.user_id = k_i.user_id 
     ) 
WHERE comp_i.comp_id = ? 
ORDER BY k_i.id ASC 

表s_k_p具有以下行:

season_id | user_id 
1 | 25 
1 | 459 
2 | 459 
3 | 459 
3 | 9999 
4 | 459 
4 | 758 

第二行是唯一一所在s_k_p.season_id = 2s_k_p.user_id = k_i.user_id應該是真實的。

+1

編輯您的問題,並提供樣本數據和期望的結果。或者,在SQL Fiddle或Rextester上設置一個示例。 –

+0

我投票支持Rextester :-) –

+2

無論是否有一行或100000行,'EXISTS'都會返回'true'或'false'。您可能希望使用'AND s_k_p.season_id = 2'(與前一個連接相似)。 – dnoeth

回答

1

如果S_K_P表中的用戶有10行,那麼您的查詢在返回10行時可能是正確的,因爲THAT是左連接。

你有你的存在第二個層面以相同S_K_P表,但包括Season_ID = 2

如果是你關心的是什麼,只有當它存在相同的用戶,第2季,然後換

LEFT JOIN s_k_p AS skp2 
    ON skp2.user_id = k_i.user_id 
    AND skp2.season_id = 2