在我开始编写Python脚本之前,我想看看MySQL是否单独可以产生结果。
我有一个产品列表:
PID Product
-----------
1 AAA
2 ABC
3 BAC
4 CAB
5 CBA
我有一份多次订购这些产品的公司名单:
CID PID
-------
1 1
2 3
1 5
3 2
1 1
2 3
期望的结果:
CID AAA ABC BAC CAB CAB CBA
---------------------------
1 Y Y
2 Y
3 Y
我如何在Python中做到这一点?
- 创建一个包含(CID AAA ABC BAC CAB CAB CBA)列的临时表
- 运行2个循环,当所需列匹配时更新所需表。
只是想知道是否存在一个MySQL独有的解决方案。
p。s:这只是一个样品,实际的问题只有很少的100种产品和很少的1000家公司。我通过在Excel中进行转置并将其转换为MySQL表,创建了一个包含100个产品的临时表。
以下是我最终采用的方法。谢谢大家的反馈。
########### Python script to generate the MySQL query ##############
#MySQL Connection String Goes here#
#Generate MySQL 'CASE' logic
cursor = db.cursor()
if __name__ == '__main__':
cursor.execute("select PID, Product from products")
productlist = cursor.fetchall()
for product in productlist:
print ("max(case when PID = %s then 'Y' else '' end) as `%s`,") % (product[0], product[1])
db.close()
按照nick建议的格式使用生成的查询。
select cid,
max(case when pid = 1 then 'Y' else '' end) as AAA,
max(case when pid = 2 then 'Y' else '' end) as ABC,
max(case when pid = 3 then 'Y' else '' end) as BAC,
max(case when pid = 4 then 'Y' else '' end) as CAB,
max(case when pid = 5 then 'Y' else '' end) as CBA
from companies
group by cid
select cid,
max(case when pid = 1 then 'Y' else '' end) as AAA,
max(case when pid = 2 then 'Y' else '' end) as ABC,
max(case when pid = 3 then 'Y' else '' end) as BAC,
max(case when pid = 4 then 'Y' else '' end) as CAB,
max(case when pid = 5 then 'Y' else '' end) as CBA
from companies
group by cid
其他的答案似乎是围绕的事实是,对于大量的产品,没有实际的方法在MySQL中单独做到这一点。
查看这个问题的答案:在MySQL中将行转换成列
所以你的问题的答案可能是:继续写Python脚本。
为什么有重复的数据?两次都是1 1和2 3
我不明白为什么要用这种方式来表示数据。如果要在UI上表示,这是个坏主意。坚持使用python,我说,在一个循环中完成它:1)创建表2)获取数据3)查询select cid, pid…用'Y'标记表
这将使您将所有结果连接到仅1列而不是5列(或100列):
SELECT
o.CID
, GROUP_CONCAT( CASE WHEN d.dummy IS NOT NULL
THEN ' Y '
ELSE ' '
END
ORDER BY p.Product
SEPARATOR ' '
) AS Products
FROM
( SELECT DISTINCT
CID
FROM Ordering
) AS c
CROSS JOIN
Product p
LEFT JOIN
(SELECT 1 AS dummy) AS d
ON EXISTS
( SELECT *
FROM Ordering AS o
WHERE o.PID = p.PID
AND o.CID = c.CID
)
GROUP BY c.CID
然而,如果你有100个产品和1万家公司,它可能会慢得要命。
我不太确定您想要的结果,但是使用GROUP BY
在MySQL中创建类似的东西相当容易,这可能使在Python中创建所需视图更容易:
SELECT orders.cid, products.product
FROM orders, products
WHERE orders.pid=products.pid
GROUP BY products.product