2016-07-04 222 views
2

我在數據庫中獲取了表EVENT_ID - ATTENDANTS varchar(300)包含以重複屬性和唯一用戶名連接的字符串形式的數據。 屬性和名稱之間的分隔符是「:」,「屬性:用戶」的每個集合都以「;」結尾。某些屬性名稱中有空格。每行中的配對數量是未知的。MySQL - 如何從字符串中獲取子字符串表

attributeC:USER_NAME1; attributeA:USER_NAME3; attributeA:user_name4; attributeA:user_name10; attributeB:user_name42;

然後,我就表對USER_ID - USER_NAME和目標表的字段USER_ID - EVENT_ID - ATTRIBUTE


提取用戶和屬性並將它們插入到目標表中的最佳方法是什麼?

我會喜歡這樣做的SQL(MySQL的),在使用功能等,使他們暫時的情況下,腳本將只運行一次。

如果這將是複雜得多,我願意使用PHP和OOP的mysqli功能。 (這將在設定的其他$ mysqli->查詢(運行)命令)


我發現,MySQL functions SUBSTRING(),查找(),長度()能來得心應手。

我能夠通過PHP來做到這一點有些費力的方式基於SELECT

  1. 並使陣列(USER_ID - USER_NAME)
  2. 使SELECT(EVENT_ID - 服務員)和每一行調用爆炸() , GET屬性,EVENT_ID,USER_ID(從上面陣列,代替SQL查詢 在每個字符串中的每個用戶名的每一個事件)
  3. paralelly插入數據到目標表用的mysqli製備 語句

但我想(希望?)有一些更好的辦法。你怎麼看?

回答

0

經過一番研究,我解決了這個問題,它並不像看起來那樣愚蠢。

代碼第一:

select OUTPUT.ID, OUTPUT.name, OUTPUT.attribute from 
(
select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 1), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 1), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 2), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 2), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 3), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 3), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 4), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';',4), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 5), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 5), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 6), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 6), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 7), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 7), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 8), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 8), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 9), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 9), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 10), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 10), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 11), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 11), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 12), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 12), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 13), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 13), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 14), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 14), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 15), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 15), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 16), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 16), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 17), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 17), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 18), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 18), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 19), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 19), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 20), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 20), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 21), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 21), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 22), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 22), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 23), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 23), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 24), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 24), ';', -1), ':', -1) as name 
from AKCE 

union 

select 
    AKCE.ID, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 25), ';', -1), ':', 1) as attribute, 
    substring_index(substring_index(substring_index(AKCE.PRIHLASENI, ';', 25), ';', -1), ':', -1) as name 
from AKCE 

order by ID 
) AS OUTPUT WHERE OUTPUT.name!='' AND OUTPUT.attribute!='' 

正如你所看到的,它是漫長的,充滿了冗餘代碼等

當您使用內側的位置比deimiters的數量更大SUBSTRING_INDEX(),它會返回空字段。由於工會,每個原始表格行(AKCE.ID)僅返回一次這些空白字段。

這些空行過濾用WHERE ...!=「」


這當然isn't以正確的方式,但在150行,最大23雙它快(僅適用不錯NAD比基本選擇慢10倍)

1

你可以在MySQL中很痛苦地做到這一點。下面是獲得前三這樣的字符串的例子:

select t.col, n.n, 
     substring_index(substring_index(t.col, ';', n.n), ';', -1) as pair, 
     substring_index(substring_index(substring_index(t.col, ';', n.n), ';', -1), ':', 1) as name, 
     substring_index(substring_index(substring_index(t.col, ';', n.n), ';', -1), ':', -1) as value 
from t join 
    (select 1 as n union all select 2 union all select 3 
    ) n 
    on length(t.col) - length(replace(t.col, ';', '') + 1 <= n.n; 

你只需要額外的數字添加到n子查詢,以獲得更多的對。

+0

我想: t.col = my_table.ATTENDANTS, n =重複次數, 究竟是什麼nn? 我不得不補充,對每個EVENT行的配對數量是未知的,最有可能不同。 – Faramos

+0

@Faramos。 。 。 'on'子句應該處理這個問題。你只需要足夠大的'n'值來獲得每一對。 –

相關問題