簡體   English   中英

Sqlite3從具有相似列值的行中獲取數據

[英]Sqlite3 Obtaining Data From Rows with Similar values in columns

我有一個像這樣設置的表:

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:在“ SELECT”附近:語法錯誤

您沒有正確使用group by並正確設置了子句。 分組依據將嘗試對與該列匹配的所有列進行分組。 因此,如果按名稱分組,則所有行都不會折疊,也不會匹配count> 1的條件

如果我在閱讀您的問題,您只需要

SELECT name FROM mobs WHERE room = %s

因為您提前知道房間號。

請注意,您的第二次嘗試失敗了,因為您需要; 您的查詢之間

您不能僅將多個獨立的SELECT查詢一個接一個地放置。

您需要使用GROUP BY來確定包含多個條目的房間,然后需要單獨的查詢以返回這些房間的所有條目:

SELECT Name, Room
FROM Mobs
WHERE Room IN (SELECT Room
               FROM Mobs
               GROUP BY Room
               HAVING COUNT(*) > 1);

要獲得所需的期望結果列表,您的查詢將簡單地是:

select Name from Mobs where Room = 2

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM