2013-10-07 47 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$)';