我有一个关于正则表达式的查询。我设计了一个包含三列一列的表,其中包含由逗号分隔的成员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
答案 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$)';