Вложенный SQL-запрос на вставку

У меня сегодня есть база данных с 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

person Andreas    schedule 04.03.2013    source источник


Ответы (2)


Я думаю, вы должны сделать все это с помощью одного запроса, который возвращает ключ и нужную информацию:

select key,
         SUM(case when pass = 1 AND key = %value% then 1 else 0 end) as passed,
         SUM(case when pass = 0 AND key = %value% then 1 else 0 end) as failed
from testcase INNER JOIN testcases ON 
      testcase.ID = testcases.testcaseid 
group by key

Насколько это возможно, вы должны позволить базе данных выполнять «итерации» и просто считывать полученные данные.

В ответ на ваш комментарий. Если у вас есть список ключей в $VALUE, вы можете сделать:

insert into statistics(key, pass, fail)
    select key,
           SUM(case when pass = 1 then 1 else 0 end) as passed,
           SUM(case when pass = 0 then 1 else 0 end) as failed
    from testcase INNER JOIN testcases ON 
         testcase.ID = testcases.testcaseid 
    where concat(',', $VALUE, ',') like concat('%', key, '%')
    group by key

Или, если вы создаете запрос, вы можете поместить список в предложение in. Итак, where может выглядеть так:

where key in (2, 3, 4, 5)
person Gordon Linoff    schedule 04.03.2013
comment
можно ли вставить ключ в слот %value% с помощью sql-запроса? Я думаю что-то вроде INSERT в statistcis (key, pass, fail), за которым следует этот запрос. - person Andreas; 04.03.2013
comment
хм, второй кажется многообещающим, но у меня тайм-аут в phpMyAdmin, завтра попробую поработать с mysqlquerybrowser и прямым доступом. добавил запрос где ключ (SELECT key FROM testcase GROUP BY key) и попробовал это. - person Andreas; 05.03.2013

Пытаться:

select key, pass, count(*) from testcase group by key, pass

Индекс на pass будет бесполезен. Индекс на key, это должно немного помочь. Но с кардинальностью 4-10, мэм, это не будет супер полезно.

person Joe Frambach    schedule 04.03.2013
comment
работает довольно хорошо, чтобы получить список, все еще в шаге от его вставки в таблицу статистики. Я посмотрю, смогу ли я получить лучшую обратную связь, используя этот запрос, и повторю в php. - person Andreas; 05.03.2013