2016-04-27 10 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:near "SELECT":構文エラー

+0

私はあなたがそれぞれの「によって何を意味するのか理解していません行には同じ値の部屋があります "。あなたの望む結果は、部屋の値が2のすべての行です。 – bitfiddler

答えて

0

あなたが与えている望ましい結果のリストを取得するには、クエリは、単純に次のようになります。

select Name from Mobs where Room = 2 
1

あなたがして、グループを使用して、適切に句を持っていません。 Group byは、その列が一致するすべての列をグループ化しようとします。つまり、あなたの行の名前なしでグループが崩壊すると、どれもあなたが部屋を知って以来、私は

SELECT name FROM mobs WHERE room = %s 

にあなたは、単に必要なあなたの質問を読んでいる場合は、カウント> 1

を持つの基準に一致しません場合前もって数値。

注:2回目の試行は必要なため失敗しています。あなたのクエリーの間

1

複数の独立したSELECTクエリーを順番に並べることはできません。

あなたは複数のエントリ付きの客室を決定するためにGROUP BYを必要とし、あなたがそれらの部屋のすべてのエントリを返すために別のクエリを必要とする:

SELECT Name, Room 
FROM Mobs 
WHERE Room IN (SELECT Room 
       FROM Mobs 
       GROUP BY Room 
       HAVING COUNT(*) > 1); 
関連する問題