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

标签 mysql sql join group-by count

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

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

我正在尝试一些查询:

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

此查询为我提供了结果,但执行起来花费了太多时间。 需要优化此查询。我坚持要优化。

欢迎任何帮助,在此先感谢。

最佳答案

无需在 GROUP BY 中涉及 cars 表。像这样重写您的查询:

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) 开始。

关于mysql - 如何从两个表中获取计数结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54253457/

相关文章:

java - 使用条件 API 进行复杂的 hibernate 查询

mysql - ON 子句中的额外条件被忽略

php - 使用 PHP 将 MySQL 查询转换为 JSON 对象

mysql - 从 cat_table 中选择类别,其中该类别的 main_table 项目不为空

sql - 如何用sql查找两个时间之间的差异

php - PDO - 显示来自 Select 语句的行

mysql - 为什么在MYSQL中使用GROUP BY时DISTINCT显示的结果不一样

php - Laravel 中的 Ajax 请求返回一个空对象

Mysql - 选择指定表中不存在的条目

sql - case 语句中 "then"处或附近的语法错误