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