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 从列中具有相似值的行获取数据的主要内容,如果未能解决你的问题,请参考以下文章

QTableView 获取具有相似列值/数据的行列表

从oracle数据库中获取日期而不从列中获取时间

根据 Pandas 中另一列中的索引从列中获取数据

执行更新时从列中获取数据

如何获取列中多个最小值的索引?

如何从列中获取最大年份并保留其余部分?