0

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

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

带着敬意

拉胡尔

4

5 回答 5

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]|$)'
于 2013-10-07T12:52:57.757 回答
1

首先,您应该对数据进行规范化,这样一开始您就不会陷入这种可怕的混乱之中。这是一个很好的资源来解释规范化。

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

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

您正在使用的正则表达式使用该[1]+组。这+意味着它必须匹配[1]1 次或多次,因此为什么你得到两行而不是一行。删除+意味着它将匹配[1]一次。

但是,这仍然无法解决您的问题,因为不止一行包含1. 这就是标准化如此重要的原因。

于 2013-10-07T12:51:39.880 回答
0

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

您可以在 Wikipedia 中找到有关此的更多信息: http ://en.wikipedia.org/wiki/Database_normalization

于 2013-10-07T12:53:09.607 回答
0

就像他们告诉您的那样,完美的解决方案是将您的数据标准化,我认为Alma Do Mundo的回答很好地解释了这一点。

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

SELECT * FROM table WHERE member_id REGEXP '(^74$|^74,|,74,|,74$)';
于 2013-10-07T13:02:10.630 回答
0

根据您的要求,您应该规范化您的数据,即制作 3 个表,一张带有发送 ID,一张带有成员 ID,一张将两者结合起来,然后您可以将它们与 INNER JOINS 链接起来。

但是,如果您打算这样做,您可以使用 a"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
于 2013-10-07T12:56:10.727 回答