Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用MySQL获取包含值的行_Sql_Mysql - Fatal编程技术网

使用MySQL获取包含值的行

使用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 '%

我有一个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 '%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)答案)?