首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从两个表中获取计数结果

如何从两个表中获取计数结果
EN

Stack Overflow用户
提问于 2019-01-18 11:51:19
回答 3查看 37关注 0票数 0

我有两张桌子,CarsDefect。我通过将car_id作为外键传递给缺陷表来维护关系。

我在cars表中有3000条记录,在缺陷表中有16K条记录(有open_defectclose_defect)。我试图找出所有的汽车(3000)计数的开放缺陷(如果没有任何开放的缺陷,对汽车应该返回0)。

我正在尝试一些疑问:

代码语言:javascript
运行
复制
SELECT cars.cars_id_primary ,IF(COUNT(defect.defect_id_primary)>0,1,0) AS `def_count`
FROM cars
LEFT JOIN defect ON cars.cars_id_primary = defect.cars_id AND defect.defect_status_id =1
WHERE cars.stage_id !=5 
GROUP BY cars.cars_id_primary
ORDER BY cars.updated_on

这个查询给出了结果,但执行起来花费了太多时间。需要优化此查询。我被困在优化。

任何帮助都欢迎,谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-01-18 11:59:16

不需要在GROUP BY中使用cars表。将查询重写如下:

代码语言:javascript
运行
复制
SELECT cars.cars_id_primary, COALESCE(agg.open_defect_count, 0) AS open_defect_count
FROM cars
LEFT JOIN (
    SELECT cars_id, COUNT(*) AS open_defect_count
    FROM defect
    WHERE defect_status_id = 1
    GROUP BY cars_id
) AS agg ON cars.cars_id_primary = agg.cars_id
WHERE cars.stage_id != 5 
ORDER BY cars.updated_on

您还需要创建索引。我建议从ix_defect(defect_status_id, cars_id)开始。

票数 2
EN

Stack Overflow用户

发布于 2019-01-18 11:58:14

可以通过使用索引来提高性能。您能否在cars_id_primary of cars表上创建索引,在cars_id of defect上创建索引,如下面所示。然后您可以尝试查询。

代码语言:javascript
运行
复制
CREATE INDEX idx1 ON cars (cars_id_primary);
CREATE INDEX idx2 ON defect (cars_id);
票数 1
EN

Stack Overflow用户

发布于 2019-01-18 11:59:19

我不明白你的问题,我在你的问题上做了一些改动,

代码语言:javascript
运行
复制
SELECT cars.cars_id_primary ,COUNT(CASE WHEN (defect.defect_id_primary)>0 THEN 1 ELSE 0 
   END) AS `def_count`
FROM cars
LEFT JOIN defect ON cars.cars_id_primary = defect.cars_id 
WHERE cars.stage_id !=5 AND defect.defect_status_id =1 
GROUP BY cars.cars_id_primary
ORDER BY cars.updated_on

尝尝这个

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54253457

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档