我使用python。我有一个查询,我的数据库上有3个表。
我已经连接到数据库并从mysql表中拉出了两列(idnum,clientname)的所有行,例如(1234,renolds),(1235,renolds2)
然后每个idnum都有一个单独的表,例如sample_divya_1234; sample_divya_1235,我们需要从每个表中获取所有电子邮件和名称。 (注意:每个idnum都有许多电子邮件和lname记录)
在步骤1中获取的所有客户端名称都存在于另一个表sample_divya3中,因此对于每个客户端名称都需要提取fname,例如(saha,renolds)
现在,电子邮件,lname,fname必须全部放入新表sql_table1
Sample_divya1:
+-----+------------+---
| idnum | clientname |
+-------+------------+-
| 1234 | renold |
| 1235 | renold1 |
+-------+------------+
sample_divya_1234:
+-------------------+----------+
| email | lname |
+-------------------+----------+
| abc@yahoo.com | abcd |
| bcd@gmail.com | bcda |
+-------------------+----------+
**sample_divya_1235**
+------------------+-----------+
| email | lname |
+------------------+-----------+
| xyz@gmail.com | xyza |
| nag@gmail.com | sai |
| hij@gmail.com | klm |
+------------------+-----------+
sample_divya3:
+--------+------------+
| fname | clientname |
+--------+------------+
| saha | renold |
| hasini | renold1 |
+--------+------------+
PRG:
import pandas as pd
import pymysql
import pymysql.cursors
from sqlalchemy import create_engine
from time import time
import datetime
conn=pymysql.connect(CONNECTDETAILS)
query = "select idnum from sample_divya1"
cursor=conn.cursor()
cursor.execute(query)
data = cursor.fetchall()
cursor.execute("drop table if exists sql_table1")
sql_table = "create table sql_table1(email varchar(128),lname varchar(128),fname varchar(128))"
cursor.execute(sql_table)
for id in data:
cursor.execute("select A.idnum, B.fname, B.clientname,C.lname,C.email from (select idnum,clientname from sample_divya1)A cross join (select fname,clientname from sample_divya3 )B where A.clientname=B.clientname cross join (select email, lname from sample_divya_"+id[0]+")C where A.idnum =id")
data_1=cursor.fetchall()
conn.commit()
print data_1
cursor.executemany("insert into sql_table1 (email,lname,fname) values (?,?,?)",data_1)
conn.commit()
conn.commit()
+------------------+----------+--------+
| email | lname | fname |
+------------------+----------+--------+
| abc@yahoo.com | abcd | saha |
| bcd@gmail.com | bcda | saha |
| xyz@gmail.com | xyza | hasini |
| nag@gmail.com | sai | hasini |
| hij@gmail.com | klm | hasini |
Mistake在查询中突出显示的部分
“”“#cursor.execute(”选择B.fname,C.lname,C.email(从sample_divya1选择idnum,clientname)A交叉连接(从sample_divya3选择fname,clientname)B其中A.clientname = B.clientname交叉连接(从sample_divya _“ + id [0] +”中选择电子邮件,lname)C 其中A.idnum = id“ )”“”
在这里前进,就知道““'where子句中的未知列'id'”” 有人可以帮忙这个where子句
答案 0 :(得分:1)
这是for id in data:
后一行的字符串连接。 id
是一个数组(是select idnum from sample_divya1
返回的行)。
将代码更改为:
for id in data:
cursor.execute("select A.idnum, B.fname, B.clientname,C.lname,C.email from (select idnum,clientname from sample_divya1)A cross join (select fname,clientname from sample_divya3 )B where A.clientname=B.clientname cross join (select email, lname from sample_divya_"+id[0]+")C where A.idnum =id")
请注意,id[0]
而不是id
。现在,它应包含查询idnum
中必需的select idnum from sample_divya1
。
如果对此有疑问,请在执行之前将生成的查询分配给变量并打印。肉眼检查它,然后尝试从MySQL命令行运行它。
答案 1 :(得分:0)
一次:
CREATE VIEW sample_divya_all
SELECT *, '1234' AS tablenum FROM sample_divya_1234
UNION ALL
SELECT *, '1235' AS tablenum FROM sample_divya_1235;
如果所有分区表都是Engine=MyISAM
,则可以用Engine=Merge
创建一个表。
查询:
SELECT sda.email, sda.lname, sd3.fname
FROM sample_divya_all sda, sample_divya1 sd1, sample_divya3 sd3
WHERE sda.tablenum = sd1.idnum
AND sd1.clientname = sd3.clientname;