-1

可以说我有 4 张桌子 ' A(id, type, protocol), B(id, A_id, info), C(id, B_id, details) and D(id, C_id, port_info)。TableA和 TableB通过idTableAA_idTable的外键连接B。同理,TableB和 TableC通过外键idfrom TableBB_idfrom Table连接C,同理,TableC和 TableD也是连接的。

现在,我想port_info从 TableD中获取所有protocolsfrom Table A。我知道一种时间复杂度为 的方法O(n^4),我目前正在使用该方法。方法如下:

db = MySQLdb.connect(host="localhost", user="root", passwd="", db="mydb")
cur = db.cursor() 
cur.execute("SELECT * FROM A")

A_results = cur.fetchall()
for A_row in A_results : 
    id      = A_row[0]
    cur.execute("SELECT * FROM B WHERE A_id = %d " % (id ))
    B_results = cur.fetchall()

    for B_row in B_results : 
        id      = B_row[0]
        cur.execute("SELECT * FROM C WHERE B_id = %d " % (id ))
        c_results = cur.fetchall()

        for C_row in C_results : 
            id      = C_row[0]
            cur.execute("SELECT * FROM D WHERE C_id = %d " % (id ))
            D_results = cur.fetchall()

            for D_row in D_results : 
                print "Port = " + str(port)

但是这种方法需要O(n^4),所以在 方面有什么有效的方法time complexity,可以解决这个问题。

非常感谢您的建议。

4

1 回答 1

2

在单个JOIN查询中执行它,让 MySQL 在处理大型数据集(毕竟这是数据库最擅长的)时进行必要的优化,为您的应用程序提供单个结果集。查询如下所示:

SELECT A.protocol, D.port_info
FROM A JOIN B ON A.id = B.A_id
       JOIN C ON B.id = C.B_id
       JOIN D ON C.id = D.C_id
ORDER BY protocol

...然后使用光标浏览该单个结果集。

于 2013-08-21T07:45:36.960 回答