2011-03-22 133 views
2

我有一个'cellid''date'(datetime)和'block'(real)列的表。有没有更好的方法来做到这一点?

我正试图找到所有在过去3天里block> 1的id。

目前,我正在做这样的:

cells = npar.db.execute("SELECT cellid FROM data WHERE block > 1 AND date=?", (files[0][1],)).fetchall() 
cells1 = npar.db.execute("SELECT cellid FROM data WHERE block >1 AND date = ?", (files[1][1],)).fetchall() 
self.common(cells,cells1) 
cells1 = npar.db.execute("SELECT cellid FROM data WHERE block >1 AND date = ?", (files[2][1],)).fetchall() 
self.common(cells,cells1) 

print len(cells) 
def common(self,a,b): 
    for item in a: 
      if item not in b: 
       a.remove(item) 

b = npar.db.execute("SELECT cellid FROM data WHERE block > 1 AND date >= ? GROUP BY cellid HAVING COUNT(cellid) = 3", (files[2][1],)).fetchall() 
     print len(b) 

LEN(B)不等于LEN(细胞)

+0

你的“HAVING COUNT(cellid)= 3”子句是没有意义的。您最后的查询只会选择那些正好出现三个blockid> 1且date> =您的时间限制的cellid。 – 2011-03-22 16:26:25

+0

这正是我想要的,我想知道它为什么不等于len(cells) – jck 2011-03-23 05:25:32

回答

3

“为过去的3天”?所以下面可以工作?

cells = npar.db.execute("SELECT cellid FROM data " 
         "WHERE block > 1 " 
         "AND date >= ? " 
         "GROUP BY cellid " 
         "HAVING COUNT(*) = 3", (files[0][1],)).fetchall() 
+0

我意识到我的原始算法在第一位是错误的。 我需要找到这3个查询中的常见元素,我纠正后,我得到了352个结果,你的查询如何,我只得到282个结果... – jck 2011-03-22 13:41:05

+0

你可以发布你的'listsub'代码吗? – eumiro 2011-03-22 13:55:15

+0

在问题中编辑。 – jck 2011-03-22 14:10:59

相关问题