可以说我有4桌'A(id, type, protocol), B(id, A_id, info), C(id, B_id, details) and D(id, C_id, port_info)
。表A
和表B
通过来自表A
的外键id
和来自表B
的A_id
连接。类似地,表B
和表C
经由外键id
从表B
和B_id
从表C
连接,并且以相同的方式,表C
和表D
也被连接。如何使嵌套查询更高效?
现在,我想从表A
的所有protocols
的表D
得到port_info
。 我知道一种方法,其时间复杂度为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
方面的任何有效的方法,可以解决这个问题。
您的建议非常感谢。
MySQL(或甚至任何SQL)101.请参阅JOIN。 – Strawberry