Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/279.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
Php 在mysql查询中检查mysql字段是否包含某个数字_Php_Mysql_Sql_Database - Fatal编程技术网

Php 在mysql查询中检查mysql字段是否包含某个数字

Php 在mysql查询中检查mysql字段是否包含某个数字,php,mysql,sql,database,Php,Mysql,Sql,Database,我有一个带有列的表,该列的ID很少,这些ID是通过multi-select放入数据库的。例如,列包含:1,4,5,7,9。是否可以通过MySQL查询检查此列中是否包含例如数字5?。 我需要选择所有在该字段中列出数字5或其他数字的人,并通过php打印他们。也许: select * from TableName where ids = '5' -- only 5 or ids like '5,%' -- begins with 5 or ids like '%,5' -- ends

我有一个带有列的表,该列的ID很少,这些ID是通过multi-select放入数据库的。例如,列包含:1,4,5,7,9。是否可以通过MySQL查询检查此列中是否包含例如数字5?。 我需要选择所有在该字段中列出数字5或其他数字的人,并通过php打印他们。

也许:

select * from TableName
where ids = '5'     -- only 5
or ids like '5,%'   -- begins with 5
or ids like '%,5'   -- ends with 5
or ids like '%,5,%' -- 5 in the middle somewhere

在处理大量数据时,速度可能不会很快。我建议将这些多选值规范化为一个新表,其中每个选择都是一行,带有指向
TableName

的链接。您可以这样编写sql查询,例如,您正在查找数字5 从您的_表_名称中选择*,其中id='5' 如果您想用php检查结果,请告诉我我将为您编写:)

但要知道,这种搜索肯定会非常缓慢。它不能使用索引,并且会导致全表扫描(读取表中的每一行)。随着表的增长,查询将变得异常缓慢

请阅读我对你的回答


你可以使用@MikeChristensen的答案来更加标准。标准SQL的另一个技巧是:

select * from TableName
where ',' || ids || ',' LIKE '%,5,%'
(在标准SQL中,
|
是字符串连接运算符,但在MySQL中,必须
将SQL_MODE=PIPES_设置为_CONCAT
设置SQL_MODE=ANSI
才能获得该行为。)

另一个特定于MySQL的解决方案是使用特殊的单词边界正则表达式,它将匹配逗号标点或字符串的开头/结尾:

select * from TableName
where ids RLIKE '[[:<:]]5[[:>:]]'
从TableName中选择*
其中ID类似于“[[::]”

这些解决方案都不能很好地扩展;它们都会导致表格扫描。很抱歉,我知道您无法更改数据库设计,但是如果您的下一个项目需要加快查询速度,您可以告诉他们,如果不重新设计表,这是不可能的。

这绝对是可能的。你可以用一句类似的话来表达;不过,如果数据库设计正常化,对你来说会更容易。如果它是该领域的唯一条目,那就行了;如果字段是'1,5,9',它将找不到它。是的,:(对不起,我的英语是abd,现在我很理解这个问题,例如,如果该字段包含1,5,9,10,3,并且您想检查该字段是否包含10,只需从您的_表中写入select*,其中ID为“%5%”;啊,不完全正确-这将错误地返回值为15的人。我知道正常形式:)我知道这很糟糕。但系统已经由其他人创建,我无法更改。请相信我,如果可以,我会使数据库正常:D。谢谢,此函数很好:)。我会在10分钟内接受这个答案:)
+1
用于内置的
mySql
功能。。我将保留我的答案,因为它更标准。超级答案,工作完美。投票表决。非常感谢。这不也是15吗?从concat(“,”,target_column“,”)类似“%”,5,%”的_表中选择*?这很巧妙-确保两端都有逗号,所以只需要一个like语句。
select * from your_table where concat(',',target_column,',') like '%,5,%'
select * from your_table where concat(',',target_column,',') like '%,5,%'