У меня сегодня есть база данных с 3 запросами статистики в тесткейсах. Я использую php для создания веб-сайта, но запросы выполняются слишком долго, поэтому я не могу показать полную статистику сайта, поскольку не хочу этого делать. Поскольку сейчас база данных редко обновляется партиями, поэтому для этой цели я мог бы создавать события, которые обновляют базы данных ежедневно/еженедельно.
Сегодня у меня есть следующие 3 запроса для отображения информации, которую я хочу:
SELECT key FROM testcase GROUP BY key;
Это дает мне список с int из 4-10 групп тестов. скажем 1,2,3,4 в случае аргумента. Затем я повторяю это в подзапросах как ключ, чтобы получить количество пройденных тестов и количество непройденных тестов со следующими двумя запросами:
SELECT COUNT(*) AS passed FROM testcase INNER JOIN testcases ON
testcase.ID = testcases.testcaseid WHERE pass = 1 AND key = %value%;
а также
SELECT COUNT(*) AS failed FROM testcase INNER JOIN testcases ON
testcase.ID = testcases.testcaseid WHERE pass = 0 AND key = %value%;
вот как это работает сегодня. Запросы занимают около 25-30 секунд для каждого ключа, что приводит к тайм-ауту сайта. (%value% — это псевдокод для текущего значения из цикла for)
Вместо этого я подумал о sql-запросе, который добавил это в таблицу базы данных, состоящую из таблиц ключей, проходов, неудач, которые я заполняю ежедневно/еженедельно, чтобы показывать на сайте в виде статистики. Я видел несколько случаев, когда вы можете выполнять итерацию с подзапросом, но поскольку 2 выполненных запроса противоположны, я не вижу никакого решения для этого.
Я безуспешно пытался индексировать значения, которые я использую в запросах (что также может быть неправильным).
// Андреас (новичок в SQL)
Изменить:
О, дилемма, где установить решение, я сделал комбайн из Гордона и Джо, чтобы сделать самый быстрый запрос, который работал как шарм:
INSERT INTO statistics (key,passed,failed)
SELECT
key,
SUM(case when T.pass = 1 then T.matches else 0 end) as passed,
SUM(case when T.pass = 0 then T.matches else 0 end) as failed
FROM
(SELECT
key,pass,COUNT(*) AS matches
FROM testcase INNER JOIN testcases ON
testcase.ID = testcases.testcaseid
GROUP BY key,pass)T
GROUP BY key