这是我的问题:我有一张表与人和物之间的关系。
Table logs
| id | user_id | object_id |
----------------------------
| 1 | 25488 | 54879 |
----------------------------
| 2 | 25488 | 54880 |
----------------------------
| 3 | 35487 | 54880 |
----------------------------
我想创建一个新表,其中每一行都是用户,每列都是一个对象。如果用户与对象有关系,我将输入1,如果不是0。
Table User
| id | user_id | o54879 | o54880 | o87984 | ...
--------------------------------------------------------
| 1 | 25488 | 0 | 1 | 0 | ...
--------------------------------------------------------
| 2 | 35487 | 0 | 1 | 1 | ...
--------------------------------------------------------
我使用java完成了工作,但速度非常慢。创建表是好的,但然后我遍历每个用户并创建正确的SQL查询(作为字符串)。所以每次我都会查询提取数据,而另一个则在新表中输入数据。我在数据库中有10万用户,所以需要一段时间。
是否有更快的方式来实现这一点,减少了对数据库的交易?
答案 0 :(得分:2)
你有目的地表,然后你知道你需要的对象列表。
此过程称为旋转表格。在MySQL中,您需要明确地执行此操作。以下是使用聚合的示例:
insert into table2(user_id, o54879, o54880, . . .)
select user_id,
max(object_id = 54879),
max(object_id = 54880),
. . .
from logs
group by user_id;
编辑:
这使用0
为假且1
为真的MySQL约定。以上逻辑相当于:
max(case when object_id = 54879 then 1 else 0 end),
max(case when object_id = 54880 then 1 else 0 end),
有时,我更喜欢显式case
语句,因为那是标准SQL。有时,我更喜欢MySQL约定,因为它确实简化了代码(代价是使非程序员的可读性略低)。