2016-04-27 69 views
0

我有一個表設置了樣柱:SQLITE3獲取數據並顯示類似值的行中

Mobs 
======== 
Name Room 
----------- 
a cat 2 
fido  2 
human 1 

我想設置提取名稱的SQL查詢語句,如果每一行都有房相同的值。

這是到目前爲止我的代碼,但它返回一個空列表:

class DBConnect(object): 

    gamedb = 'game.db' 

    def __init__(self): 
     pass 

############ TABLE PlayerInfo ################### 
    def modify_data(self, string, dbfile, mode='get', fetch='all'): 

     db = sqlite3.connect(dbfile) 
     db.row_factory = lambda cursor, row: row[0] 
     c = db.cursor() 
     data = '' 

     if mode == 'get': 
      c.execute(string) 
      if fetch == 'all': 
       data = c.fetchall() 
      elif fetch == 'one': 
       data = c.fetchone() 
      db.close() 

      return data 

     elif mode == 'update' or mode == 'insert': 
      # update data 
      c.execute(string) 
      db.commit() 
      db.close() 

     else: 
      print 'Something went wrong\nAborting Program...' 
      sys.exit() 

def mob_getname(self, value, using="id"): 

    if using == "id": 
     query = "SELECT name FROM Mobs WHERE ID=%s" % value 
     return DBConnect().modify_data(query, DBConnect.gamedb)[0] 
    elif using == "room": 
     query = "SELECT name, room from Mobs " \ 
       "GROUP BY name, room " \ 
       "HAVING COUNT(name) > 1" 
     return DBConnect().modify_data(query, DBConnect.gamedb) 
    else: 
     print 'Wrong value of using' 
     return None 

嘗試:

print Mobs().mob_getname(2, using="room") 

與空單出現?

我想顯示

['a cat', 'fido'] 

謝謝列表

UPDATE :::

我試圖取代與被執行的查詢:

query = "SELECT COUNT(*), room FROM Mobs GROUP BY Mobs " \ 
     "SELECT COUNT(*), room FROM Mobs GROUP BY room HAVING COUNT(*)>1 " \ 
     "SELECT name FROM Mobs WHERE room=%s " % value 

現在我得到一個錯誤:sqlite3.OperationalError:靠近「SELECT」:語法錯誤

+0

我不明白你所說的「各是什麼意思行具有相同的房間價值「。你想要的結果是房間值爲2的所有行。 – bitfiddler

回答

0

要獲取您的預想結果列表,您的查詢將僅僅是:

select Name from Mobs where Room = 2 
1

您沒有使用GROUP BY和正確having子句。分組依據將嘗試對該列匹配的所有列進行分組。所以,如果你組的名字不關你的行會崩潰,沒有人會匹配具有標準計數> 1

如果我讀了你的問題,你只需要

SELECT name FROM mobs WHERE room = %s 

,因爲你知道房間數量提前。

請注意,您的第二次嘗試失敗,因爲您需要;在你的查詢之間

1

你不能一個接一個地放置多個獨立的SELECT查詢。

你需要一個GROUP BY確定與多個條目的房間,然後你需要一個單獨的查詢返回的這些房間中的所有條目:

SELECT Name, Room 
FROM Mobs 
WHERE Room IN (SELECT Room 
       FROM Mobs 
       GROUP BY Room 
       HAVING COUNT(*) > 1); 
相關問題