会用JOIN,却不懂编程的“程序员”(2)
1.1. 前言
在前面的文章我们留下的一个问题,就是使用了拆分的SQL却不能一次性的取出想要的结果。需要使用应用程序来拼凑结构。这边我们使用python来讲述如何拼凑出自己想要的结果。
1.2. 思路
1、向每个表中取出自己需要的结果。
2、使用程序将结构进行拼凑,从而获得我们需要的结构。
1.3. 程序实现
在python中我们引入了pandas这个模块:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
|
#!/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
(
)
|
输出结果如下:
1
2
3
4
5
6
7
8
9
10
11
|
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
这么一看,分完SQL之后的查询和程序的实现确实恐怖了好多。又多些了那么多代码,效率还不一定增加了。除了结果是想要的,和能明确的知道这个业务实现的每个细节(对后期维护有帮助),其他的就没有什么可以值得说的地方。对于程序员来说每次都要编写这么多的代码实现数据的拼凑,如果在加上逻辑的实现那代码量还不是“蹭蹭蹭”网上涨。
1.4. 补充
上面的数据在应用程序中Join我这边使用了python的pandas的Dataframe的merge来做的。对于做java的朋友来说可以使用Spark的DataFrame的merge来做。当然Spark也提供了Python的API但是暂时还没有pandas强大。不过在未来就不好说了。
昵称:HH
QQ:275258836
ttlsa群交流沟通(QQ群②:6690706 QQ群③:168085569 QQ群④:415230207(新) 微信公众号:ttlsacom)
感觉本文内容不错,读后有收获?
逛逛衣服店,鼓励作者写出更好文章。
收 藏
成长的对话版权声明:以上内容作者已申请原创保护,未经允许不得转载,侵权必究!授权事宜、对本内容有异议或投诉,敬请联系网站管理员,我们将尽快回复您,谢谢合作!