Php 在逗号分隔的字符串mysql中查找值

Php 在逗号分隔的字符串mysql中查找值,php,mysql,sql,select,where,Php,Mysql,Sql,Select,Where,我的数据库中有一个表,如下所示: member_id name mgroup_others member_group_id 1 Name1 2,3,10 1 2 Name2 4,5,10 1 3 Name3 6,7,10 1 4 Name4 8,9

我的数据库中有一个表,如下所示:

member_id    name    mgroup_others    member_group_id
    1        Name1      2,3,10              1
    2        Name2      4,5,10              1
    3        Name3      6,7,10              1
    4        Name4       8,9                1
我需要创建一个SELECT语句,用于选择“mgroup_others”逗号列表中指定整数所在的所有成员。例如,我将编写一条SQL语句,选择“mgroup_others”包含“10”的所有成员,并返回成员1、2和3,但不返回4,因为10不在该字段中。任何帮助都将不胜感激!谢谢我也在用PHP写这篇文章

SELECT * FROM table WHERE FIND_IN_SET(10,mgoup_others)>0
这是一个临时解决方案,在生产数据库中,这将比turbo snail慢。

因为mgroup\u others是一个varchar列,如果只使用LIKE运算符而不是像SET LIKE中的FIND\u,会怎么样

您也可以像下面这样使用FIND_IN_SET

select * from table1
where find_in_set(10,mgroup_others)
请在此处查看小提琴演示

像这样使用

SELECT * 
FROM yourtable 
WHERE mgroup_others LIKE '%10%'

可能被证明是有用的。蹩脚的方法:使用这种方法,酷的方法:规范化数据库。我不能规范化数据库,因为它是以这种方式构建的大型CMS的一部分。@Fred ii-FIND_IN_SET基本上是一个字符串操作。你可以把它看作是LIKE的一个特殊版本。因此,使用FIND_IN_SET绕过了对该字段使用索引。标准化版本可能会更快,更便于携带。缺点是您需要一个额外的表,但如果您正在构建一个严肃的应用程序,那么无论如何您都可能有多个表,而规范化这一点应该不会是一个障碍。所以,在_集中查找_是很蹩脚的,因为它使不正确地规范化数据库变得非常诱人@弗雷德二世-不客气也许你可以阅读。它列出了各种范式。现在,也许您还不想学习和使用所有字段,但使字段“原子化”而不是在单个字段中包含多个值实际上是第一个标准形式,因此也是规范化的第一步。需要制定适当的外键约束和索引。当数据量增加时,这是保持数据库性能的第一步,也可能是最重要的一步。我认为实际上不需要>0。在这里看一把小提琴,看看它是如何工作的@Rahul可能是,我一直使用>0。这将匹配12100。如果您想使用like,那么应该使用WHERE CONCAT'、'、mgroup_others'、'比如“%”、10、%”之类的内容。与FIND_IN_SET函数相比不是很方便,因为FIND_IN_SET函数本身已经是一个很好的解决方案。只有在没有其他以10结尾的组(即110)也可以匹配1,21000的情况下,这才有效。如果您想使用like,那么应该使用WHERE CONCAT'、'、mgroup_others'、'比如“%”、10、%”之类的内容。与FIND_IN_SET函数相比,它不是很方便,因为FIND_IN_SET函数本身已经是一个很好的解决方案了。@FuzzyTree,这是正确的。“在集合中查找”非常合适,但没有包含在答案中,因为Mihai已经回答了它,但看到了包含的小提琴,这是双向的。@GolezTrol,看到包含的小提琴了吗。我也提到了带有find_in_set的查询。没有包括在内,因为Mihai的回答中已经提到了。不管怎么说,编辑了我的答案。我明白了,但你的答案说你可以避免在集合中找到喜欢的东西。这不仅会给出不正确的结果,尤其是如果您希望在没有第二个%的情况下找到与“3”匹配的项目。所以现在你有了一个错误的答案和一把小提琴,它没有显示你的答案,而是米海的。
SELECT * 
FROM yourtable 
WHERE mgroup_others LIKE '%10%'