从另一个表创建一个mysql表

时间:2013-12-12 21:48:27

标签: java mysql sql performance

这是我的问题:我有一张表与人和物之间的关系。

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万用户,所以需要一段时间。

是否有更快的方式来实现这一点,减少了对数据库的交易?

1 个答案:

答案 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约定,因为它确实简化了代码(代价是使非程序员的可读性略低)。