不知道這是可能的,但如果是,就會使我的查詢速度要快得多。傳遞結果從一個子查詢的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
但是,這是相當緩慢的,因爲table
和another_table
是巨大的。但實際上,我只對t1
中的查詢產生的值感興趣。因此,如果我能以某種方式將這些結果納入t2
和t3
的IN
子句中,查詢應該顯着加快。
這可能嗎?
不太清楚我猜。好的我在想的是將查詢改爲類似於:
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
沒了感覺 - 爲什麼使用聚合函數(COUNT),如果你只是想檢查支承臺的ID的存在?很多錯別字,順便說一句,也是。請張貼您想要的列(以及它們來自的表格)作爲最終結果。 – 2011-05-06 18:14:20
您的第二個查詢與第一個查詢幾乎相同,但Group_Concat除外。您可以通過修改查詢來幫助我們,以便他們進行編譯。例如,T1派生表中的'foo.id'和'bar.id'將不起作用。此外,當你在後面的子查詢中使用'bar.id'時,它不會幫助我們。 – Thomas 2011-05-06 18:42:24
job_id,keyword_id'在job_keywords中是唯一的嗎? Job_skills中的'job_id,skill_id'是唯一的嗎? – Thomas 2011-05-06 20:00:53