2014-07-17 25 views
0
SELECT * 
FROM table_a 
LEFT JOIN table_b ON (table_b.id = table_a.id) 
WHERE table_b.created BETWEEN ? AND ? 
     AND table_b.manager IN(
     SELECT DISTINCT (b.id) 
     FROM table_b a 
      INNER JOIN table_b b ON a.manager = b.id 
      AND b.user_level > 0 
      AND b.id != 1 
    ) 

如何刪除子查詢和使用JOINS,而不是在上面的查詢如何使用JOINS,而不是子查詢

感謝

+0

請向我們展示您的表格結構和示例數據以及您想要的輸出示例。 – CodeBird

+2

一個連接並不需要使用'IN'替代子查詢 - 結果可能會不同(取決於您的數據模型和數據) –

+0

什麼是您的表結構和您想要完成的任務 –

回答

0

的MySQL 5.5(和更低版本)的優化產生DEPENDENT SUBQUERYIN (SELECT ...)這意味着每個匹配的行被找到,IN(SELECT ...)被評估,使得選擇緩慢。您查詢的

簡單的優化是使內嵌視圖如下:

SELECT * 
FROM table_a LEFT JOIN table_b ON (table_b.id = table_a.id) 
    INNER JOIN (
      SELECT DISTINCT b.id AS id 
      FROM table_b a 
       INNER JOIN table_b b ON a.manager = b.id 
       AND b.user_level > 0 
       AND b.id != 1 
    ) x ON table_b.manager = x.id 
WHERE table_b.created BETWEEN ? AND ? 
    AND x.id IS NOT NULL; 

我覺得avobe查詢將產生與自己相同。

最後,DISTINCT不是函數。請使用SELECT DISTINCT b.id而不是SELECT DISTINCT (b.id)