Sqlite3 从列中具有相似值的行获取数据
Posted
技术标签:
【中文标题】Sqlite3 从列中具有相似值的行获取数据【英文标题】:Sqlite3 Obtaining Data From Rows with Similar values in columns 【发布时间】:2016-04-27 00:53:57 【问题描述】:我有一个表设置如下:
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']
谢谢
更新:::
我已尝试将执行的查询替换为:
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": syntax error
【问题讨论】:
我不明白你所说的“每一行都有相同的房间值”是什么意思。您想要的结果只是房间值为 2 的所有行。 【参考方案1】:您没有正确使用 group by 和子句。 Group by 将尝试对该列匹配的所有列进行分组。因此,如果您按名称分组,您的所有行都不会折叠,也不会符合 count > 1
的条件如果我正在阅读您的问题,您只需要
SELECT name FROM mobs WHERE room = %s
因为你提前知道了房间号。
注意,您的第二次尝试失败了,因为您需要 ;在您的查询之间
【讨论】:
【参考方案2】:您不能一个接一个地放置多个独立的 SELECT 查询。
您需要一个 GROUP BY 来确定具有多个条目的房间,然后您需要一个单独的查询来返回这些房间的所有条目:
SELECT Name, Room
FROM Mobs
WHERE Room IN (SELECT Room
FROM Mobs
GROUP BY Room
HAVING COUNT(*) > 1);
【讨论】:
【参考方案3】:要获得您提供的所需结果列表,您的查询只需:
select Name from Mobs where Room = 2
【讨论】:
以上是关于Sqlite3 从列中具有相似值的行获取数据的主要内容,如果未能解决你的问题,请参考以下文章