使用MySQL获取包含值的行
我有一个MySQL查询,其中包含一些变量,如下所示: 消息表接收器cols使用MySQL获取包含值的行,sql,mysql,Sql,Mysql,我有一个MySQL查询,其中包含一些变量,如下所示: 消息表接收器cols user1行:1,3,5 user2行:2,3 user3行:1,4 我想获取包含“3”值的行。所以我会得到“user1”和“user2” 我试过了,但自然不行 mysql_query("SELECT * FROM messages WHERE receiver='3'"); 我该怎么做?试试这个: mysql_query("SELECT * FROM messages WHERE receiver like '%
- user1行:1,3,5
- user2行:2,3
- user3行:1,4
mysql_query("SELECT * FROM messages WHERE receiver='3'");
我该怎么做?试试这个:
mysql_query("SELECT * FROM messages WHERE receiver like '%3%'");
试试这个:
mysql_query("SELECT * FROM messages WHERE receiver like '%3%'");
最简单的方法是重新构造数据库 有一个带有
id
、text
等的表messages
,一个带有id
、name
的表receiver
,还有一个带有id\u msg
和id\u rec
的表msg2rec
(或者你想怎么称呼它)
这样你就可以做到:
SELECT m.text, r.name
FROM msg2rec m2r
LEFT JOIN messages m ON m2r.id_msg = m.id
LEFT JOIN receivers r ON m2r.id_rec = r.id
WHERE m2r.id_rec = 3
或者,如果您保留您的结构,则应使用:
SELECT text
FROM messages
WHERE rec RLIKE (",3,") OR rec RLIKE("^3,") OR rec RLIKE(",3$")
可能有一个regexp与上面的3个相同,但我现在无法理解。
无论如何,我会选择第一个选项:更干净、更容易维护和使用最简单的方法是重组数据库 有一个带有
id
、text
等的表messages
,一个带有id
、name
的表receiver
,还有一个带有id\u msg
和id\u rec
的表msg2rec
(或者你想怎么称呼它)
这样你就可以做到:
SELECT m.text, r.name
FROM msg2rec m2r
LEFT JOIN messages m ON m2r.id_msg = m.id
LEFT JOIN receivers r ON m2r.id_rec = r.id
WHERE m2r.id_rec = 3
或者,如果您保留您的结构,则应使用:
SELECT text
FROM messages
WHERE rec RLIKE (",3,") OR rec RLIKE("^3,") OR rec RLIKE(",3$")
可能有一个regexp与上面的3个相同,但我现在无法理解。
无论如何,我会选择第一个选项:更干净、更容易维护和使用,就像其他人提到的那样,尝试在关系数据库中搜索非规范化数据“1,2,3,4,44,5,55”不是一个好方法。关系数据库是为处理规范化数据而构建的 你可以。。注意,可以将字符串拆分为子集(),然后执行IN-search操作,但这不是推荐的方法 解决这个问题的最好办法是从顶层开始。因为试图围绕它构建,而不是实际修复它,从来都不是一个好方法 解决方案;规范化数据
Message
- [PK] Id
- Body...
Reciever
- [PK] Id
- Name...
MessageReceiver
- [FK] MessageId
- [FK] ReceiverId
使用此表结构,您可以轻松查询:
SELECT M.* FROM MessageReceiver MR
INNER JOIN Message M ON M.Id=MR.MessageId
WHERE MR.ReceiverId=3
用这种方法解决这个问题以后会省去很多麻烦。就像其他人提到的那样,尝试在关系数据库中搜索非规范化数据“1,2,3,4,44,5,55”不是一个好方法。关系数据库是为处理规范化数据而构建的 你可以。。注意,可以将字符串拆分为子集(),然后执行IN-search操作,但这不是推荐的方法 解决这个问题的最好办法是从顶层开始。因为试图围绕它构建,而不是实际修复它,从来都不是一个好方法 解决方案;规范化数据
Message
- [PK] Id
- Body...
Reciever
- [PK] Id
- Name...
MessageReceiver
- [FK] MessageId
- [FK] ReceiverId
使用此表结构,您可以轻松查询:
SELECT M.* FROM MessageReceiver MR
INNER JOIN Message M ON M.Id=MR.MessageId
WHERE MR.ReceiverId=3
用这种方法解决这个问题以后会省去很多麻烦。如果一行包含“13,30,33”怎么办?您的查询将与之匹配,但不应该匹配。@asah:如果我们只对
3
感兴趣,我们可以像mysql\u查询一样(“从接收方“%,3,%”这样的消息中选择*”
因为可以看到,每个值都用逗号分隔。@Sarfaz:该策略在以下输入“3”或“3,7”或“1,3”时失败。@Asah:因此,我在回答中输入了查询以检测该值,只有OP才能知道其值的准确程度。@Sarfraz:可以使用正则表达式()匹配字符串中的“孤立”3。。这可能会让@asah平静一点:-)…如果一行包含“13,30,33”怎么办?您的查询将与之匹配,但不应该匹配。@asah:如果我们只对3
感兴趣,我们可以像mysql\u查询一样(“从接收方“%,3,%”这样的消息中选择*”
因为可以看到,每个值都用逗号分隔。@Sarfaz:该策略在以下输入“3”或“3,7”或“1,3”时失败。@Asah:因此,我在回答中输入了查询以检测该值,只有OP才能知道其值的准确程度。@Sarfraz:可以使用正则表达式()匹配字符串中的“孤立”3。。这可能会让@asah平静一点:-)…请给我们一些关于messages表中字段的更多信息。最明显的是,我们需要知道“接收器”的数据类型。它是字符串(试试@Sarfaz'答案)还是数字(试试我的(@lexu)答案)?请给我们一些关于messages表中字段的更多信息。最明显的是,我们需要知道“接收器”的数据类型。是字符串(试试@Sarfaz'答案)还是数字(试试我的(@lexu)答案)?