2013-03-04 195 views
1

我今天有一個包含3個查詢統計信息的數據庫。我使用PHP來建立一個網站,但查詢需要很長的時間來執行,所以我不能顯示完整的網站統計數據,因爲我不想做。因爲現在數據庫很少分批更新,所以我可以爲此目的每天/每週更新數據庫。SQL嵌套插入查詢

我有以下3個查詢今天顯示我想要的信息:

SELECT key FROM testcase GROUP BY key; 

這讓我從4-10組測試與詮釋列表。爭論的情況下說1,2,3,4。 我然後在子查詢的關鍵重複此得到的不具有下列2個查詢通過測試的順利通過測試的數量和數量:

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 

回答

1

我認爲你應該做這一切都與一個查詢,返回你想要的密鑰和信息:可能

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 

在一定程度上,你應該讓數據庫做「迭代」和剛纔讀返回結果數據。

回覆您的評論。如果您在$值鍵列表,那麼你可以做:

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) 
+0

是否有可能使用sql查詢插入%value%插槽中的密鑰?我正在思考沿着INSERT的行進入statistcis(鍵,通過,失敗),然後是該查詢。 – Andreas 2013-03-04 19:50:47

+0

嗯,第二個看起來很有前途,但是我在phpMyAdmin中超時,明天會嘗試使用mysqlquerybrowser和直接訪問工作。在(SELECT鍵FROM FROM testcase GROUP BY鍵)_中添加查詢_where鍵並嘗試執行該操作。 – Andreas 2013-03-04 20:28:16

1

嘗試:

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

pass上的索引將無濟於事。索引key,這應該有所幫助。但是以4-10的基數,meh,不會超級有用。

+0

工作得很好得到的名單,從統計表格中插入它仍然一步。我會看看是否可以使用此查詢獲得更好的反饋,並在php中進行迭代。 – Andreas 2013-03-04 20:30:24