Sqlite3从列中获取具有相似值的行中的数据

时间:2016-04-27 00:53:58

标签: python sql sqlite

我的表设置如下:

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”:语法错误

3 个答案:

答案 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