2011-05-06 65 views
1

不知道這是可能的,但如果是,就會使我的查詢速度要快得多。傳遞結果從一個子查詢的IN子句中的另一個子查詢在MySQL

基本上我有這樣的查詢:

SELECT * 
    FROM (SELECT bar.id 
      FROM pivot_table 
      WHERE foo.id = x) t1 
    JOIN (SELECT count(*) c1, bar.id 
      FROM table 
     GROUP BY bar.id) t2 ON t1.id = t2.id 
    JOIN (SELECT count(*) c2, bar.id 
      FROM another_table 
     GROUP BY bar.id) t3 ON t1.id = t3.id 

但是,這是相當緩慢的,因爲tableanother_table是巨大的。但實際上,我只對t1中的查詢產生的值感興趣。因此,如果我能以某種方式將這些結果納入t2t3IN子句中,查詢應該顯着加快。

這可能嗎?


不太清楚我猜。好的我在想的是將查詢改爲類似於:

SELECT * 
    FROM (GROUP_CONCAT (bar.id) as results 
       FROM pivot_table 
       WHERE foo.id = x) t1 
     JOIN (SELECT count(*) c1, bar.id 
       FROM table 
       WHERE bar.id IN (*results from t1*) 
       GROUP BY bar.id) t2 ON t1.id = t2.id 
     JOIN (SELECT count(*) c2, bar.id 
       FROM another_table 
       WHERE bar.id IN (*results from t1*) 
       GROUP BY bar.id) t3 ON t1.id = t3.id 

可能會更快,因爲它縮小了在t2和t3中掃描的行數。情況不是這樣嗎?


每個人都希望看到它,所以這裏是完整的查詢:

SELECT (k_group.count/jk_group.count) * (s_group.count/jk_group.count) AS ratio, 
     jk_group.k_id               , 
     jk_group.s_id 
FROM 
     -- find the keywords for the job 
     (SELECT jk.keyowrd_id AS k_id 
     FROM jobs_keywords jk 
     WHERE job_id = 50100 
     ) 
     extracted_keywords 
     -- calculate the necessary values using group_by functions 
     INNER JOIN 
        (SELECT COUNT(*) count, 
          skill_id AS s_id , 
          keyword_id AS k_id 
        FROM  jobs_keywords jk 
          JOIN jobs_skills js 
          ON  js.job_id = jk.job_id 
          JOIN job_feed_details d 
          ON  d.job_id = js.job_id 
        WHERE d.moderated  = 1 
        GROUP BY skill_id, 
          keyword_id 
       ) 
        jk_group 
     ON  extracted_keywords.k_id = jk_group.k_id 
     INNER JOIN 
        (SELECT COUNT(*)  count, 
          keyword_id AS k_id 
        FROM  jobs_keywords jk 
          JOIN job_feed_details d 
          ON  d.job_id = js.job_id 
        WHERE d.moderated  = 1 
        GROUP BY keyword_id 
       ) 
        k_group 
     ON  jk_group.k_id = k_group.k_id 
     INNER JOIN 
        (SELECT COUNT(*) count, 
          skill_id AS s_id 
        FROM  jobs_skills js 
          JOIN job_feed_details d 
          ON  d.job_id = js.job_id 
        WHERE d.moderated  = 1 
        GROUP BY skill_id 
       ) 
        s_group 
     ON  jk_group.s_id = s_group.s_id 
ORDER BY ratio DESC 
LIMIT 25 
+1

沒了感覺 - 爲什麼使用聚合函數(COUNT),如果你只是想檢查支承臺的ID的存在?很多錯別字,順便說一句,也是。請張貼您想要的列(以及它們來自的表格)作爲最終結果。 – 2011-05-06 18:14:20

+0

您的第二個查詢與第一個查詢幾乎相同,但Group_Concat除外。您可以通過修改查詢來幫助我們,以便他們進行編譯。例如,T1派生表中的'foo.id'和'bar.id'將不起作用。此外,當你在後面的子查詢中使用'bar.id'時,它不會幫助我們。 – Thomas 2011-05-06 18:42:24

+0

job_id,keyword_id'在job_keywords中是唯一的嗎? Job_skills中的'job_id,skill_id'是唯一的嗎? – Thomas 2011-05-06 20:00:53

回答

1

我能做到什麼,我試圖做像這樣:

SELECT * 
    FROM (@var:=GROUP_CONCAT(bar.id) as results 
       FROM pivot_table 
       WHERE foo.id = x) t1 
     JOIN (SELECT count(*) c1, bar.id 
       FROM table 
       WHERE bar.id IN (@var) 
       GROUP BY bar.id) t2 ON t1.id = t2.id 
     JOIN (SELECT count(*) c2, bar.id 
       FROM another_table 
       WHERE bar.id IN (@var) 
       GROUP BY bar.id) t3 ON t1.id = t3.id 

但在速度方面的優勢不是太顯著。我現在已經放棄了一種查詢方法,以支持許多較小的查詢,而且這樣更好。

0

修訂給出實際的查詢

我想你可以消減查詢到:

Select jk.Count(Distinct jk.keyword_id) 
     * jk.Count(Distinct js.skill_id) 
     /Power(Count(*), 2) 
     As ratio 
    , js.skill_id 
    , jk.keyword_id 
From jobs_keywords As jk 
    Join jobs_skills As js 
     On js.job_id = jk.job_id 
Where jk.job_id =50100 
Group By js.skill_id, jk.keyword_id 
Order By ratio Desc 
Limit 25 
1
SELECT COUNT(t1.id) c1, COUNT(t2.id) c2, COUNT(t3.id) c3, t1.id 
FROM pivot_table t1 
JOIN table t2 ON t1.id=t2.id 
JOIN another_table t3 ON t3.id=t1.id where t1.id=x group by t1.id 

請確保pivot_table.id,table.id和another_table.id被索引

有關查詢: 查詢的問題是driverd表使用加入緩衝液,讓你的查詢速度快,你應該增加你的加入緩衝區大小