Как получить результат для подсчета из двух таблиц - PullRequest
0 голосов
/ 18 января 2019

У меня есть две таблицы, Cars и Defect. Я поддерживаю связь, передавая car_id таблице дефектов в качестве внешнего ключа.

У меня 3000 записей в таблице автомобилей и 16 тысяч записей в таблицах дефектов (с open_defect и close_defect). Я пытаюсь выяснить все автомобили (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

Этот запрос дает мне результат, но занимает слишком много времени для выполнения. Нужно оптимизировать этот запрос. Я застрял, чтобы оптимизировать.

Любая помощь приветствуется, заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 18 января 2019

Не нужно вовлекать в машину столик внутри 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).

0 голосов
/ 18 января 2019

Я не могу понять ваш вопрос, я немного изменил ваш запрос,

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 голосов
/ 18 января 2019

Вы можете увеличить производительность, используя индексы. Можете ли вы создать индекс для cars_id_primary из cars таблицы и индекс для cars_id из defect, как показано ниже sql. Тогда вы можете попробовать свой запрос.

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