2013-12-12 84 views
0

這是我的問題:我有一個表與人和對象之間的關係。從另一個表創建一個mysql表

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查詢(作爲字符串)。所以每次我都會提取數據,而另一個則會在新表格中輸入數據。我在數據庫中有100 000個用戶,所以需要一段時間。

有沒有更快的方法來實現這一點,減少交易數據庫?

回答

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; 

編輯:

這將使用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約定,因爲它確實簡化了代碼(代價是讓非程序員的可讀性稍差)。

+0

謝謝,我想這是我需要的。如果當前用戶沒有對象54879,則最大值爲0? –