我有以下表格
awarded_companies
,tenders
,grants
。
有2对多对多关系
awarded_companies <-> tenders
awarded_companies <-> grants
我想列出所有属于招标的获奖公司。
所以查询看起来像这样:
SELECT awarded_companies.*
FROM awarded_companies
JOIN awarded_company_tenders ON (awarded_company_tenders.awarded_company_id = awarded_companies.id)
GROUP BY awarded_companies.id
实际上我有大量的记录,需要对结果进行分页。当我尝试计算属于awarded_companies
的所有tender
时,查询需要30秒。
以下是计算行和EXPLAIN EXTENDED
的两种方法的基准:
我唯一可以提出的是向awarded_companies
添加2个标志 - 一个用于判断该公司是否属于tender
,另一个用于判断该公司是否属于grant
1}}。
这样我就可以删除join
和group by
,查询将如下所示:
SELECT * FROM awarded_companies WHERE has_tender=1
任何人都可以帮我吗?
答案 0 :(得分:0)
SELECT count(awards_companies.id) 来自award_companies JOIN awards_company_tenders ON(granted_company_tenders.awarded_company_id = awards_companies.id) GROUP BY award_companies.id
答案 1 :(得分:0)
只是一个建议。从'award_company_tenders&#39;直接选择计数是否存在任何逻辑问题。我们必须从'award_companies&#39;并加入“award_company_tenders&#39;寻找计数。
答案 2 :(得分:0)
SELECT *
FROM awarded_companies AS ac
WHERE EXISTS
( SELECT *
FROM awarded_company_tenders
WHERE awarded_company_id = ac.id
)
注意:通过避免JOIN
(分解了行数),可以避免GROUP BY
(内爆)。
答案 3 :(得分:0)
我添加了2个标记,查询运行速度非常快。
感谢大家的评论。