2012-06-05 3 views
1

У меня есть таблица со следующими именами столбцов: audit_name, audit_choice и «slno» в качестве первичного ключа с автоматическим добавлением и без использования выходных данных.Оптимизируйте запрос mysql, чтобы выбрать значения

Имя audit_name может быть повторено, а значения audit_choice ограничены определенными значениями, такими как «Пройден», «Сбой».

Ожидаемый результат моего запроса - получение количества счетчиков «Пропущенных» и «Сбой» для каждого «Аудиторского имени».

Вот запрос, который я пробовал, но требуется около 3-4 минут для выполнения около 1000 записей.

SELECT audit_name, 
    (SELECT COUNT(*) AS Passed FROM audit AS p1 
    WHERE p1.audit_name=p2.audit_name AND p1.audit_choice="Passed") AS Passed, 
    (SELECT COUNT(*) AS Failed FROM audit AS p3 
    WHERE p3.audit_name=p2.audit_name AND p2.audit_choice="Failed") AS Failed 
    FROM audit AS p2 
    GROUP BY audit_name 

Просьба предложить мне, как я могу оптимизировать запрос.

ответ

4
SELECT audit_name, 
     SUM(audit_choice = 'Passed') AS passed, 
     SUM(audit_choice = 'Failed') AS failed 
FROM audit 
GROUP BY 
     audit_name 
+0

Чтобы уточнить, выражение типа 'audit_choice = 'Passed'' возвращает логическое значение, которое равно 0 для False и 1 для True. –

+0

спасибо, это работает чудо – AjayR

2

Я также предлагаю двигаться строковые значения, как «Сдал» и «Failed» из таблицы и использовать целочисленные идентификаторы вместо этого - они по сравнению гораздо быстрее, чем строки.

1
SELECT audit_name, 
     SUM(if(audit_choice = 'Passed',1,0)) AS passed, 
     SUM(if(audit_choice = 'Failed',1,0)) AS failed 
    FROM audit 
    GROUP BY 
    audit_name 
+0

вы опечалились ..., 1,0 на неудачу должны быть, 0,1 ... как есть, оба имеют одинаковые результаты подсчета – DRapp

Смежные вопросы