我的表设置如下:
Mobs
========
Name Room
-----------
a cat 2
fido 2
human 1
我正在尝试设置一个sql查询语句,如果每行具有相同的room值,则提取名称。
到目前为止,这是我的代码,但它返回一个空列表:
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 :(得分:1)
您没有正确使用group by和having子句。分组依据会尝试将该列匹配的所有列分组。因此,如果您按名称分组,您的所有行都不会崩溃,并且没有一个符合计数>的条件1
如果我正在阅读您的问题,您只需要
SELECT name FROM mobs WHERE room = %s
因为你提前知道房间号码。
注意,你的第二次尝试失败是因为你需要;在您的查询之间
答案 1 :(得分:1)
您不能一个接一个地放置多个独立的SELECT查询。
您需要GROUP BY来确定包含多个条目的房间,然后您需要单独的查询来返回这些房间的所有条目:
SELECT Name, Room
FROM Mobs
WHERE Room IN (SELECT Room
FROM Mobs
GROUP BY Room
HAVING COUNT(*) > 1);
答案 2 :(得分:0)
要获得所需的结果列表,您的查询将只是:
select Name from Mobs where Room = 2