假设我有4张桌子A(id, type, protocol), B(id, A_id, info), C(id, B_id, details) and D(id, C_id, port_info)
。表A
和表B
通过表id
中的外键A
和表A_id
中的B
连接。同样,表B
和表C
通过表id
中的外键B
和表B_id
中的C
连接,并在方式,表C
和表D
也已连接。
现在,我想从表port_info
中的所有D
的表protocols
中获取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
是否有任何有效的方法可以解决这个问题。
非常感谢您的建议。
答案 0 :(得分: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
...然后使用光标浏览单个结果集。