【问题标题】:How to get result for count from two tables如何从两个表中获取计数结果
【发布时间】:2019-01-18 11:51:19
【问题描述】:

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

我在汽车表中有 3000 条记录,在缺陷表中有 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

这个查询给了我结果,但执行时间太长。 需要优化这个查询。我一直在优化。

欢迎任何帮助,提前致谢。

【问题讨论】:

  • 有关性能的问题应包括 SQL 查询中涉及的每个表的表结构 (SHOW CREATE TABLE <table>) 结构以及EXPLAIN <query>
  • 你想在 select 子句中使用汽车表中的列吗?

标签: mysql sql join group-by count


【解决方案1】:

GROUP BY 内无需涉及汽车表。像这样重写您的查询:

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】:

    您可以通过使用索引来提高性能。您可以在carscars_id_primary 表上创建索引并在defectcars_id 上创建索引,如下面的sql。然后你可以试试你的查询。

    CREATE INDEX idx1 ON cars (cars_id_primary);
    CREATE INDEX idx2 ON defect (cars_id);
    

    【讨论】:

    • "您可以通过使用索引来提高性能" 实际上并不总是会误导优化器可能选择不使用索引并选择表扫描而不是索引“扫描” "
    【解决方案3】:

    我无法理解你的问题,我对你的查询做了一些改动,

    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
    

    试试这个

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-29
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 1970-01-01
      相关资源
      最近更新 更多