繁体   English   中英

从另一个表创建一个mysql表

[英]Creating a mysql Table from another Table

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

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

是否有更快的方法来实现这一点,减少数据库的事务?

你有目的地表,然后你知道你需要的对象列表。

此过程称为旋转表。 在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;

编辑:

这使用MySQL约定, 0为假, 1为真。 以上逻辑相当于:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM