2013-08-23 94 views
0

我運行這樣的查詢在Python腳本優化SQL查詢,多個具有不同參數選擇

results = [] 
for day in days: 
    for hour in hours: 
     for id in ids: 
      query = "SELECT AVG(weight) from table WHERE date >= '%s' \ 
                  AND day=%s \ 
                  AND hour=%s AND id=%s" % \ 
        (paststr, day, hour, _id) 
      results.append(query.exec_and_fetch()) 

還是在這一天不是用來蟒蛇,爲每一天,每一個小時的人,對於每個小時的列表中的所有ID,我需要獲得某些項目的平均權重。

爲例:

day 0 hour 0 id 0 
day 0 hour 0 id 1 
... 
day 2 hour 5 id 4 
day 2 hour 6 id 0 
... 

這導致有大量的查詢,所以我想,如果有可能做到這一點的一個代替。我一直在擺弄着一些觀點,但我總是被困在不同的參數上,或者他們變得非常慢,這是一個相當大的桌子。

我最親密的猜測是這樣的:

create or replace view testavg as 
     select date, day, hour, id, (select avg(weight) from cuWeight w_i 
             where w_i.date=w_o.date 
              and w_i.day=w_o.day 
              and w_i.hour=w_o.hour) 
     from cuWeight w_o; 

但這並沒有返回任何東西,等待一個或兩個我取消查詢後分鍾。

表看起來像這樣:

CREATE TABLE `cuWeight` (
    `id` int(11) NOT NULL default '0', 
    `date` date default NULL, 
    `hour` int(11) default '0', 
    `weight` float default '0', 
    `day` int(11) default '0', 
    KEY `id_index` (`id`) 
) ENGINE=MyISAM DEFAULT CHARSET=latin1; 

MyISAM和latin1的是歷史(幾乎化石)的原因。

+1

向我們展示了創建表語句和示例數據(HTTP:/ /sqlfiddle.com),關於正在使用的存儲引擎的信息。並更好地定義你的問題不是每個人都可以閱讀Python代碼... –

回答

0

你需要一個GROUP BY查詢

select date, day, hour, id, avg(weight) 
    from cuWeight 
    where date > *some date* 
group by date, day, hour, id ; 

如果它還是慢,你可以在大塊分裂它,比如:

for day in days: 
    query = "select date, day, hour, id, avg(weight) \ 
       from cuWeight \ 
       where date > '%s' \ 
        and day = %s \ 
       group by date, day, hour, id " % \ 
      (paststr, day) 
...