[英]Better way to write this SQL in Python
无论如何,我可以减少重复的论点吗? 例如,timepattern重复了4次,很难跟踪大的查询。
sql = ( "SELECT IFNULL(b.inviters/COUNT(DISTINCT c.id),0), "
" FROM_UNIXTIME(c.registered_at, %s) "
"FROM ( SELECT COUNT(1) AS inviters, joindate "
" FROM "
" ( SELECT DISTINCT(y.id) AS inviters, "
" FROM_UNIXTIME(y.registered_at, %s) AS joindate "
" FROM user_invites z "
" INNER JOIN users y ON y.id = z.inviter_id "
" WHERE z.created_at >= %s "
" ) a "
" GROUP BY a.joindate "
" ) b "
"INNER JOIN users c ON FROM_UNIXTIME(c.registered_at, %s) = b.joindate "
"WHERE c.registered_at BETWEEN %s AND %s "
"GROUP BY FROM_UNIXTIME(c.registered_at, %s) " )
args = ( timepattern, timepattern, datestart_int, timepattern,
datestart_int, dateend_int, timepattern )
cursor.execut(sql, args)
data = list(cursor.fetchall())
cursor.close()
connection.close()
尝试使用args作为参数dictionnary并使用显式字符串插值args(即%(parameter_name)s
):
sql = ( "SELECT IFNULL(b.inviters/COUNT(DISTINCT c.id),0), "
" FROM_UNIXTIME(c.registered_at, %(timepattern)s) "
"FROM ( SELECT COUNT(1) AS inviters, joindate "
" FROM "
" ( SELECT DISTINCT(y.id) AS inviters, "
" FROM_UNIXTIME(y.registered_at, %(timepattern)s) AS joindate "
" FROM user_invites z "
" INNER JOIN users y ON y.id = z.inviter_id "
" WHERE z.created_at >= %(datestart_int)s "
" ) a "
" GROUP BY a.joindate "
" ) b "
"INNER JOIN users c ON FROM_UNIXTIME(c.registered_at, %(timepattern)s) = b.joindate "
"WHERE c.registered_at BETWEEN %(datestart_int)s AND %(dateend_int)s "
"GROUP BY FROM_UNIXTIME(c.registered_at, %(timepattern)s) " )
args = {
"timepattern" : timepattern,
"datestart_int" : datestart_int,
"dateend_int" : dateend_int,
}
cursor.execute(sql, args)
您可以将args用作dict,然后在%(name)s
类的查询中使用它,例如
args = {'timepattern': timepattern, 'dateend_int': dateend_int}
sql = ( "SELECT IFNULL(b.inviters/COUNT(DISTINCT c.id),0), "
" FROM_UNIXTIME(c.registered_at, %(timepattern)s) "
"FROM ( SELECT COUNT(1) AS inviters, joindate "
" FROM "
" ( SELECT DISTINCT(y.id) AS inviters, "
" FROM_UNIXTIME(y.registered_at, %(timepattern)s AS joindate "
" FROM user_invites z "
" INNER JOIN users y ON y.id = z.inviter_id "
" WHERE z.created_at >= %(datestart_int)s "
" ) a "
" GROUP BY a.joindate "
" ) b "
"INNER JOIN users c ON FROM_UNIXTIME(c.registered_at, %(timepattern)s) = b.joindate "
"WHERE c.registered_at BETWEEN %(datestart_int)s AND %(datetart_int)s "
"GROUP BY FROM_UNIXTIME(c.registered_at, %(timepattern)s)" )
cursor.execute(sql, args)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.