2014-01-09 83 views
0

說我有一個表叫PeoplePersonID列和Name,我可以選擇一個人的名字像裏面:嵌套的「SQL SELECT語句」爲/正則表達式的操作

SELECT Name FROM People WHERE PersonID = 1 

這對於這個例子將返回'John'

我也有另一個表稱爲ForumPosts與領域ForumPostIDPostContent其中PostContent只是TEXT這對於這個例子的目的可以是像"My Name is John""John likes football"

現在我要對其執行了基於查詢給定的初始PersonID將返回來自ForumPosts的所有行,其中Person的名稱與PostContent字段中包含的單詞相匹配。

一個正則表達式將匹配單個單詞(或在這種情況下,人的名字)是:

[[:<:]]*Person'sNameHere*[[:>:]] 

所以最好我想我的SQL邏輯是這樣的:

Select * FROM ForumPosts WHERE PostContent 
REGEX [[:<:]](SELECT Name FROM People WHERE PersonID = '1') [[:>:]] 

不過我我不確定這是否甚至可能,或者我將如何構建查詢。

+0

請注意,你正在嘗試做的,在這裏,不會規模非常好...使用'REGEXP' /'RLIKE'查詢,就像普通的'LIKE'操作符(在這種情況下有一個例外,這裏不重要),將要求服務器讀取和比較*每行*,*每次*您運行查詢,隨着數據增長而變慢。這些運算符不能使用索引進行優化。 –

回答

1

聽起來就像你想動態地創建一個正則表達式。正則表達式只是MySQL中的字符串,所以你可以使用CONCAT來創建你想要的字符串。

SELECT * 
FROM ForumPosts 
WHERE PostContent 
    REGEXP CONCAT('[[:<:]]',(SELECT Name FROM People WHERE PersonID = '1'),'[[:>:]]') 

更妙的是,你可以使用JOIN,而不是一個子查詢

SELECT ForumPosts.* 
FROM ForumPosts 
JOIN People ON PersonID = 1 
WHERE PostContent REGEXP CONCAT('[[:<:]]',People.Name,'[[:>:]]') 

DEMO:http://sqlfiddle.com/#!2/40828/1

0

您可以使用exists子查詢來實現此邏輯。如果我正確理解你的邏輯:

select fp.* 
from ForumPosts fp 
where exists (select 1 
       from people p 
       where personid = '1' and 
        fp.PostContent regex concat('[[:<:]]', name, '[[:>:]]') 
      )