不知道这是可能的,但如果是,就会使我的查询速度要快得多。传递结果从一个子查询的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