会用JOIN,却不懂编程的“程序员”(2)

HH MySQL python会用JOIN,却不懂编程的“程序员”(2)已关闭评论7,6612字数 2239阅读7分27秒阅读模式

1.1. 前言

在前面的文章我们留下的一个问题,就是使用了拆分的SQL却不能一次性的取出想要的结果。需要使用应用程序来拼凑结构。这边我们使用python来讲述如何拼凑出自己想要的结果。

1.2. 思路

1、向每个表中取出自己需要的结果。文章源自运维生存时间-https://www.ttlsa.com/mysql/using_join_no_programing_2/

2、使用程序将结构进行拼凑,从而获得我们需要的结构。文章源自运维生存时间-https://www.ttlsa.com/mysql/using_join_no_programing_2/

1.3. 程序实现

在python中我们引入了pandas这个模块:文章源自运维生存时间-https://www.ttlsa.com/mysql/using_join_no_programing_2/

#!/usr/bin/env python
# -*- coding:utf-8 -*-
 
import pandas as pd
import mysql.connector
import sys
  
reload(sys)
sys.setdefaultencoding('utf-8')
 
conf = {
  'host'     : '127.0.0.1',
  'port'     : '3306',
  'database' : 'test',
  'user'     : 'root',
  'password' : 'root'
}
 
conn = mysql.connector.connect(**conf)
 
cur = conn.cursor()
 
######################
## 分  查找订单信息 ##
######################
# 同过 用户ID 获得用户名
user_sql = '''
  SELECT user_id, name FROM user WHERE user_id IN(10);
'''
user_info = pd.read_sql(user_sql, conn)
 
# 通过 用户ID 获得订单信息
order_sql = '''
  SELECT user_id, order_id, num FROM orders WHERE user_id IN(10);
'''
order_info = pd.read_sql(order_sql, conn)
# 获取所有订单ID
order_ids = order_info['order_id'].astype(str)
 
# 通过上面获得的 订单ID 获得订单商品信息。
order_good_sql = '''
  SELECT order_id, good_name FROM order_good WHERE order_id IN ({ids});
'''.format(ids = ','.join(order_ids))
order_good_info = pd.read_sql(order_good_sql, conn)
 
# 通过 订单ID 获得券信息
coupon_sql = '''
  SELECT order_id, name FROM coupon WHERE order_id IN({ids});
'''.format(ids = ','.join(order_ids))
coupon_info = pd.read_sql(coupon_sql, conn)
 
# 拼凑订单信息 
# 用户信息 + 订单信息
new_data_1 = user_info.merge(order_info, 
                         left_on='user_id', 
                         right_on='user_id', 
                         how='left')
# new_data_1 + 订单商品信息
new_data_2 = new_data_1.merge(order_good_info, 
                         left_on='order_id', 
                         right_on='order_id', 
                         how='left')
# new_data_2 + 券信息
new_data_3 = new_data_2.merge(coupon_info, 
                         left_on='order_id', 
                         right_on='order_id', 
                         how='left')
print new_data_3
conn.close()

输出结果如下:文章源自运维生存时间-https://www.ttlsa.com/mysql/using_join_no_programing_2/

user_id name_x  order_id    num      good_name    name_y
0       10     HH         1  11111   order_good_1  coupon_1
1       10     HH         1  11111   order_good_2  coupon_1
2       10     HH         2  22222   order_good_3       NaN
3       10     HH         2  22222   order_good_4       NaN
4       10     HH         3  33333   order_good_5  coupon_3
5       10     HH         3  33333   order_good_6  coupon_3
6       10     HH         4  44444   order_good_7       NaN
7       10     HH         4  44444   order_good_8       NaN
8       10     HH         5  55555   order_good_9  coupon_5
9       10     HH         5  55555  order_good_10  coupon_5

源代码:no_join_1文章源自运维生存时间-https://www.ttlsa.com/mysql/using_join_no_programing_2/

这么一看,分完SQL之后的查询和程序的实现确实恐怖了好多。又多些了那么多代码,效率还不一定增加了。除了结果是想要的,和能明确的知道这个业务实现的每个细节(对后期维护有帮助),其他的就没有什么可以值得说的地方。对于程序员来说每次都要编写这么多的代码实现数据的拼凑,如果在加上逻辑的实现那代码量还不是“蹭蹭蹭”网上涨。文章源自运维生存时间-https://www.ttlsa.com/mysql/using_join_no_programing_2/

1.4. 补充

上面的数据在应用程序中Join我这边使用了python的pandas的Dataframe的merge来做的。对于做java的朋友来说可以使用Spark的DataFrame的merge来做。当然Spark也提供了Python的API但是暂时还没有pandas强大。不过在未来就不好说了。文章源自运维生存时间-https://www.ttlsa.com/mysql/using_join_no_programing_2/

 文章源自运维生存时间-https://www.ttlsa.com/mysql/using_join_no_programing_2/

昵称:HH
QQ:275258836
ttlsa群交流沟通(QQ群②:6690706 QQ群③:168085569 QQ群④:415230207(新) 微信公众号:ttlsacom)文章源自运维生存时间-https://www.ttlsa.com/mysql/using_join_no_programing_2/

感觉本文内容不错,读后有收获?文章源自运维生存时间-https://www.ttlsa.com/mysql/using_join_no_programing_2/

逛逛衣服店,鼓励作者写出更好文章。文章源自运维生存时间-https://www.ttlsa.com/mysql/using_join_no_programing_2/ 文章源自运维生存时间-https://www.ttlsa.com/mysql/using_join_no_programing_2/

weinxin
我的微信
微信公众号
扫一扫关注运维生存时间公众号,获取最新技术文章~
HH
  • 本文由 发表于 19/04/2016 00:21:31
  • 转载请务必保留本文链接:https://www.ttlsa.com/mysql/using_join_no_programing_2/