2013-10-07 48 views
0

我有一個關於定期expression.I有設計一個包含三個列一列的表的查詢含有被commas.I分開的會員ID我你看我的表structure.Please遵循Mysql的正則表達式

send_id member_id 

1   1211,23,34 
2   1,23 

我只想選擇send_id 2包含member_id爲1

這個數據是我使用

SELECT * FROM table WHERE column REGEXP '^[1]+$'; 

查詢,但此查詢給我兩排。請幫幫我。

與問候

拉胡爾

+6

您需要規範化數據。 –

+3

「一列包含用逗號分隔的成員ID」 - 是的,這就是你滑落的地方 – Strawberry

+0

兩行都有1,所以它會同時返回。如上所述,您需要規範化您的數據 – Jonathon

回答

1

首先,你應該讓你在擺在首位這種烏七八糟是不歸您的數據。 Here's a good resource explaining normalization.

其次,我相信你的問題在於你的正則表達式。試試這個:

SELECT * FROM table WHERE column REGEXP '^[1]$'; 

您正在使用的正則表達式使用[1]+組。 +意味着它必須匹配[1] 1次或更多次,因此爲什麼你得到兩行而不是一行。刪除+表示它將匹配[1]一次。

但是,這仍然不能解決您的問題,因爲不止一行包含1。這就是正常化如此重要的原因。

5

永不分離值存儲在一列

規範化像

 
send_id member_id 

1   1211 
1   23 
1   34 
2   1 
2   23 

的結構如果您還想要你的正則表達式,那麼這將是

SELECT * FROM t WHERE column REGEXP '(^|[^0-9])1([^0-9]|$)' 
+0

其實我不想創建大量的行,這就是爲什麼我使用這種方法來存儲身份證,請建議我我要走正確的道路? – rahul

+2

你的理由完全不正確。處理分隔符分隔值的開銷要比時間多得多,這將使數據庫花費在插入額外行上。這是關於正常化和基本關係數據庫原則。你可以閱讀[這裏](http://en.wikipedia.org/wiki/Relational_database)。 –

+0

當然,我要正常化桌子 – rahul

0

根據您的要求,您應該標準化您的數據,即做3個表,一個與發送ID,一個成員編號,並一個結合了兩者,那麼你可以將它們與INNER JOINS連接起來。

但是,如果您打算這樣做,您可以使用"WHERE member_id LIKE %1%"來提取所有相關字段。您必須使用該應用程序來過濾相關記錄。

在任何情況下,如果您不打算規範化數據,則必須使用前端過濾掉結果。

內的一個例子聯接語法看起來像這樣

SELECT * FROM SendTable 
    JOIN Send_Member ON SendTable.send_id = Send_Member.send_id 
    JOIN Member ON Member.member_id = Send_Member.member_id 
    WHERE Member.member_id = 1; 

在架構的樣子:

Sendtable: 
send_Id (primary key) 
...other fields 

Send_Member: 
send_id (primary key and foreign key to SendTable) 
member_id (primary key and foreign key to member) 
...any fields you might want that are relevant to the particular send table and member table link 

Member: 
member_id (primarykey) 
...other fields 
0

就像他們已經告訴你,完美的解決辦法是標準化你的數據,我認爲Alma Do Mundo答案解釋得很好。

如果您想要使用REGEXP,您必須考慮四種方法; ID是唯一的一個,ID是第一個,ID在中間,ID在最後。我使用id = 74爲例:

SELECT * FROM table WHERE member_id REGEXP '(^74$|^74,|,74,|,74$)';