【问题标题】:SQL/Python: Combine multiple entries from "linked" tables into one single comma-separated string per entrySQL/Python:将“链接”表中的多个条目组合成一个逗号分隔的字符串,每个条目
【发布时间】:2020-04-07 19:32:24
【问题描述】:

我有 3 个表中的数据。对于 tblDataDef 中的每个条目,我都有几个标签(如主题标签或类别)。这些标签存储在 tblDataTags 中,其中每个标签都有一个条目(D_ID 是 tblDataDef ID,TAG_ID 是 tblTags ID)。

例如,假设我的第一个条目有标签(“a”、“b”、“c”)。以下将表示:

tblDataDef| **ID=1**  

tblDataTags| ID=47, **D_ID=1**, *TAG_ID=1*  
tblDataTags| ID=48, **D_ID=1**, *TAG_ID=2*  
tblDataTags| ID=49, **D_ID=1**, *TAG_ID=3*  

tblTags| *ID=1*, TAG="a"  
tblTags| *ID=2*, TAG="b"  
tblTags| *ID=3*, TAG="c"  

我需要创建一个新的列/字段,其中包含与 tblDataDef 中的每个 ID 关联的所有标签的逗号分隔字符串。因此,对于上面的示例,新字段将填充“a,b,c”。我这样做是为了在 tkinter 中填充 TreeView 列。

我当前的方法需要一点时间,因为它在遍历 tblDataDef ID 时会执行数千次查询。有更快的方法吗?谢谢!!

正在加载 tblDataDef 数据:

def load_data():
    conn = pyodbc.connect(strConn)
    strSQL = "SELECT ID, ITEM, DESCRIP FROM tblDataDef"
    df = pd.read_sql_query(strSQL, conn)
    conn.close()
    return df

正在加载标签(对于来自 tblDataDef 的单个 ID):

def load_data_tags(series):
    conn = pyodbc.connect(strConn)   
    strSQL = ("SELECT tblTags.TAG "
              "FROM tblDataTags "
              "LEFT JOIN tblTags ON tblDataTags.TAG_ID=tblTags.ID "
              f"WHERE D_ID = {series}")  
    df = pd.read_sql_query(strSQL, conn)
    conn.close()
    return df

用数据填充 tkinter 的 TreeView:

df = load_data()
for i, r in df.iterrows():
    _id = self.tree.insert("", index="end")
    self.tree.set(_id, column="ID", value=r["ID"])
    self.tree.set(_id, column="Item", value=r["ITEM"])
    self.tree.set(_id, column="Description", value=r["DESCRIP"])

    tags = load_data_tags(r["ID"])
    tags = tags["TAG"].values.tolist()
    tags = ";".join(tags)
    self.tree.set(_id, column="Tags", value=tags)

【问题讨论】:

    标签: python sql python-3.x tkinter


    【解决方案1】:

    如果使用的数据库引擎支持聚合函数GROUP_CONCAT()(MySQL和sqlite3都支持),那么可以将load_data()load_data_tags()这两个函数合二为一:

    def load_all_data():
        strSQL = ('SELECT dd.ID, ITEM, DESCRIP, GROUP_CONCAT(TAG) AS TAGS '
                  'FROM tblDataDef dd, tblDataTags dt, tblTags t '
                  'WHERE dd.ID = dt.D_ID AND dt.TAG_ID = t.ID '
                  'GROUP BY dd.ID')
        df = pd.read_sql_query(strSQL, conn)
        return df
    

    然后填充结果:

    df = load_all_data()
    for i, r in df.iterrows():
        _id = tree.insert('', index='end')
        tree.set(_id, column='ID', value=r['ID'])
        tree.set(_id, column='Item', value=r['ITEM'])
        tree.set(_id, column='Description', value=r['DESCRIP'])
        tree.set(_id, column='Tags', value=r['TAGS'])
    

    【讨论】:

      猜你喜欢
      • 2020-09-29
      • 2016-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-04
      • 1970-01-01
      • 2013-04-02
      • 2018-01-19
      相关资源
      最近更新 更多