【问题标题】:How can I query in sql to get a queryset reformated如何在 sql 中查询以重新格式化查询集
【发布时间】:2025-11-24 13:05:02
【问题描述】:

我有一个主键为user_id 的用户表和一个主键为item_id 的项目表。

然后我有另一个记录表,记录用户何时选择一个项目(多对多)。 它的属性包括user_iditem_idpick_time

我想要一张这样的桌子: wanted query result

其中“1”表示用户至少选择过一次,而空白表示没有。
无论如何,请帮助我解决这个问题:

  • 如何编写我的 sql 代码来获取此查询集?
  • 如果不能在 sql 查询中解决这个问题,如何重构我的数据库?

对不起,我糟糕的 sql 技巧和糟糕的表达方式。

非常感谢!

【问题讨论】:

  • 能否提供用户和项目表的详细信息?
  • 这称为 pivot。

标签: python mysql sql django


【解决方案1】:

您可以通过在 pandas 中使用 pivot_table 来实现此目的。

import pandas as pd

data = {"Users": [1,2,3,4,5,1,2,5,1,2,4,5,2,3,4,5,4,5],
    "Items": 
['A','A','A','A','A','B','B','B','C','C','C','C','D','D','D','D','E','E']}

users_items_joined = pd.DataFrame(data, columns = ["Users", "Items"])
users_items_joined["count"] = 1

您现在将获得类似于下图所示的内容,

    Users Items  count
0       1     A      1
1       2     A      1
2       3     A      1
3       4     A      1
4       5     A      1
5       1     B      1
6       2     B      1
7       5     B      1
8       1     C      1
9       2     C      1
10      4     C      1
11      5     C      1
12      2     D      1
13      3     D      1
14      4     D      1
15      5     D      1
16      4     E      1
17      5     E      1

您还可以从数据库中检索实际表并将其转换为 pandas 数据框,然后对其应用以下函数以获得您期望的用户项矩阵。

user_item_matrix = users_items_joined.pivot_table('count', 'Users', 'Items')
print(user_item_matrix)

上面的代码将在您提供的图像中准确给出您所要求的内容。

Items    A    B    C    D    E
Users                         
1      1.0  1.0  1.0  NaN  NaN
2      1.0  1.0  1.0  1.0  NaN
3      1.0  NaN  NaN  1.0  NaN
4      1.0  NaN  1.0  1.0  1.0
5      1.0  1.0  1.0  1.0  1.0

【讨论】: