4

在我开始编写 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 解决方案。

ps:这只是一个示例,实际问题只有100个产品和1000个公司。我通过在 Excel 中进行转置为 100 个产品创建了一个临时表,并将其转换为 MySQL 表。

以下是我最终采用的方法。谢谢你们的反馈。

########### 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
4

5 回答 5

3
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
于 2011-08-15T19:47:20.490 回答
2

其他答案似乎在跳舞的是,对于大量产品,仅在 MySQL 中没有实际的方法可以做到这一点。

查看这个问题的答案:Transpose rows into columns in MySQL

因此,您的问题的答案可能是:继续编写 Python 脚本。

于 2011-08-15T19:58:28.607 回答
0

这将使您将所有结果仅连接到 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 种产品和 10K 家公司,那么它可能会非常缓慢。

于 2011-08-15T22:57:31.950 回答
0

为什么会有重复数据?两次,有一个 1 1 和一个 2 3。

我不理解以这种方式表示数据的愿望。如果要在您的 UI 上表示,这是一个坏主意。坚持我所说的python,并在一个循环中完成:1)创建表2)获取数据3)foreach导致select cid,pid的结果集......用'Y'标记表

于 2011-08-15T19:55:19.343 回答
-1

我不太确定您想要的结果,但是在 MySQL usind 中创建类似的东西相当容易GROUP BY,这可能更容易在 Python 中创建所需的视图:

SELECT orders.cid, products.product
FROM orders, products
WHERE orders.pid=products.pid
GROUP BY products.product
于 2011-08-15T19:50:00.117 回答