带有正则表达式的Mysql

时间:2013-10-07 12:48:01

标签: php mysql

我有一个关于正则表达式的查询。我设计了一个包含三列一列的表,其中包含由逗号分隔的成员ID。我向您展示我的表结构。请按照

send_id    member_id

1          1211,23,34
2          1,23

我想只选择包含member_id为1的send_id 2数据。

这是我正在使用的查询

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

但是这个查询给了我两行。请帮助我。

问候

的Rahul

5 个答案:

答案 0 :(得分: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]|$)'

答案 1 :(得分:1)

首先,你应该正常化你的数据,这样你就不会在这个可怕的混乱中。 Here's a good resource explaining normalization.

其次,我相信你的问题在于你的正则表达。试试这个:

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

您正在使用的正则表达式使用[1]+组。 +表示必须匹配[1] 1次或更多次,因此您获得两行而不是一行。删除+表示它将匹配[1]一次。

但是,由于多行包含1,因此仍然无法解决您的问题。这就是规范化如此重要的原因。

答案 2 :(得分:0)

在列中包含多个值不是设计DB的好习惯。 您应该规范化您的数据,即在表格的每个元素中只放置一条原子信息。

您可以在维基百科中找到有关此内容的更多信息: http://en.wikipedia.org/wiki/Database_normalization

答案 3 :(得分:0)

根据您的要求,您应该规范化您的数据,即制作3个表,一个带有发送ID,一个带有成员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

答案 4 :(得分:0)

就像他们告诉你的那样,完美的解决方案会使你的数据正常化,我认为Alma Do Mundo回答很好地解释了它。

如果你想使用REGEXP,你必须考虑四种方法; id 是唯一的一个, id 是第一个, id 在中间, id 在最后。我使用 id = 74 作为例子:

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