2017-10-04 95 views
0

我試圖從sql中使用REGEXP的字段中提取主題標籤。現在我在做這個查詢如何在sql中選擇與regexp匹配的單詞?

SELECT caption FROM posts WHERE caption REGEXP "#[a-zA-Z0-9_]+" 

,但我想提取特定的單詞這是由該模式匹配。

一樣,如果我在我的數據庫

id caption   user 
1 #hi i'm here 2 
2 hello #hi there 3 
3 i'm x #hi  4 
4 I'm #Driving 2 
5 I #love #food 6 

以下條目現在我的查詢返回

caption 
#hi i'm here 
hello #hi there 
i'm x #hi 
I'm #Driving 
I #love #food 

但我想

tag 
#hi 
#Driving 
#love 
#food 

我怎樣才能做到這一點。

感謝您的幫助。

+0

不要以爲你可以做攻略,看https://stackoverflow.com/questions/6617996/simulating-regex-capture-groups-in-mysql –

+1

好像你應該有另一個表中存儲後的井號標籤。 – jarlh

+0

@jarlh喜歡多對多的關係嗎? –

回答

2

CREATE TABLE /插入數據

CREATE TABLE Table1 
    (`id` INT, `caption` VARCHAR(255), `user` INT) 
; 

INSERT INTO Table1 
    (`id`, `caption`, `user`) 
VALUES 
    (1, '#hi i''m here', 2), 
    (2, 'hello #hi there', 3), 
    (3, 'i''m x #hi', 4), 
    (4, 'I''m #Driving', 2), 
    (5, 'I #love #food', 6) 
; 

您可以在標題與SUBSTRING_INDEX(SUBSTRING_INDEX(caption, ' ', 1), ' ', -1)分裂的話拿到的第一個字SUBSTRING_INDEX(SUBSTRING_INDEX(caption, ' ', 2), ' ', -1)獲得的第二個字。

但是,如何使它動態,讓更多的單詞可以分裂。

首先你用SQL創建一個數字生成器。 這個查詢從1到100

查詢生成號碼列表

SELECT 
    @number := @number + 1 AS number 
FROM (
    (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) row1 
    CROSS JOIN 
    (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) row2 
    CROSS JOIN 
    (SELECT @number:=0) AS init_user_params 
) 

結果

number 
-------- 
     1 
     2 
     3 
     4 
     5 
     6 
     7 
     8 
     9 
     10 
     ... 
     ... 
     90 
     91 
     92 
     93 
     94 
     95 
     96 
     97 
     98 
     99 
    100 

現在我們可以CROSS JOIN與我們的表1我們數生成的列表(在我們的例子中) 這將生成(表計數)* 100個記錄與重複的記錄。 使用所產生的號碼列表在SUBSTRING_INDEX(SUBSTRING_INDEX(caption, ' ', [word offset]), ' ', -1)像這樣

查詢

SELECT 
    DISTINCT #remove duplicates 
    SUBSTRING_INDEX(SUBSTRING_INDEX(caption, ' ', numbers.number), ' ', -1) AS tag 
FROM (

    SELECT 
    @number := @number + 1 AS number 
    FROM (
    (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) row1 
    CROSS JOIN 
    (SELECT 0 UNION ALL SELECT 1 UNION ALL SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL SELECT 6 UNION ALL SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL SELECT 9) row2 
    CROSS JOIN 
    (SELECT @number:=0) AS init_user_params 
) 
) 
AS numbers 
CROSS JOIN Table1 
WHERE 
SUBSTRING_INDEX(SUBSTRING_INDEX(caption, ' ', numbers.number), ' ', -1) LIKE '#%' #we only want words starting with # 
ORDER BY 
Table1.id ASC 

結果

tag  
---------- 
#hi  
#Driving 
#love  
#food  

注意

  1. 此查詢僅在標題等於100個字或更少時纔有效
  2. 此查詢在小型表上相當快。在較大的桌子上,這將不能很好地擴展,因爲關閉了加號
  3. 你真的應該有一個存儲hashtags的表格。
+0

嗨,男士,Thnx你的答案。它確實有幫助。但是,正如你所說,還有其他評論。我想我應該在其他表格中存儲主題標籤。所以我正在考慮發佈和標籤之間的「多對多關係」。我應該這樣做嗎?順便說一句,你的回答非常有用,謝謝。 –

+0

@aary trivedi沒問題..它可能是多對多的關係,但它依賴於您的需求。 –